我正在寻找一种方法来动态地将条带标签文本包装在一个facet_wrap
或facet_grid
调用中.我找到了一种方法来实现这一目的strwrap
,但是我需要指定一个width
输出才能按需运行.通常预先不知道小平面的数量,因此该方法需要我width
基于数据集和绘图大小迭代地调整参数.是否可以动态指定包装函数的宽度,或者是否有其他选项可用于标记可以更好地工作的方面?
library(ggplot2)
df = expand.grid(group=paste(c("Very Very Very Long Group Name "), 1:9),
x=rnorm(5), y=rnorm(5), stringsAsFactors=FALSE)
df$groupwrap = unlist(lapply(strwrap(df$group, width=30, simplify=FALSE), paste,
collapse="\n"))
p = ggplot(df) +
geom_point(aes(x=x, y=y)) +
facet_wrap(~groupwrap)
Run Code Online (Sandbox Code Playgroud)
更新:基于@baptiste和@thunk提供的指导,我想出了下面的选项.目前,它仅适用于指定的字体系列和大小,但理想情况下,应该也可以使用默认theme
设置.也许有ggplot2
经验的人有一些改进的建议.
library('grid')
grobs <- ggplotGrob(p)
sum = sum(sapply(grobs$width, function(x) convertWidth(x, "in")))
panels_width = par("din")[1] - sum # inches
df$group = as.factor(df$group)
npanels = nlevels(df$group)
if (class(p$facet)[1] == "wrap") {
cols = n2mfrow(npanels)[1]
} else {
cols …
Run Code Online (Sandbox Code Playgroud) 我正在使用下面的代码生成一个情节,并希望隐藏"mag"(大小)图例,但仍保留"深度"(颜色)图例.
ggplot(quakes, aes(long, lat, size=mag, colour=depth)) + geom_point()
我正在寻找一种方法来隐藏使用下面的代码创建的情节中的一个aestetic传说.要按日期缩放点颜色,我必须将日期转换为数字,而我宁愿不在图上显示日期图例.另一方面,形状图例是要显示的重要信息.我明白这legend.position="none"
将完全删除传说,但那时我留下了如何传达形状背后的意义的问题.
library(ggplot2)
w<-read.table("data.txt", header=TRUE)
pt.data <- w[w$dt==min(w$dt),]
p <- ggplot(data=w, aes(OAD,RtgValInt,color=dt,shape=Port)) +
geom_jitter(size=3, alpha=0.75) +
scale_colour_gradient(limits=c(min(w$dt),
max(w$dt)),
low="#9999FF", high="#000066") +
geom_point(data=pt.data,
color="red", size=3, aes(shape=Port))
print(p)
Run Code Online (Sandbox Code Playgroud)
该data.txt
文件包括以下行.
Date Port OAD RtgValInt dt
12/31/2010 Grp1 1.463771 1.833333 14974
12/31/2010 Grp2 1.193307 2.071429 14974
11/30/2010 Grp1 1.454115 1.833333 14943
11/30/2010 Grp2 1.127755 2.071429 14943
10/29/2010 Grp1 1.434965 2.000000 14911
10/29/2010 Grp2 1.055758 2.071429 14911
09/30/2010 Grp1 1.441773 2.000000 14882
09/30/2010 Grp2 1.077799 2.071429 14882
Run Code Online (Sandbox Code Playgroud)
在使用ggplot2创建的绘图底部添加脚注的最佳方法是什么?我尝试过使用这里提到的逻辑组合http://www.r-bloggers.com/r-good-practice-%E2%80%93-adding-footnotes-to-graphics/以及ggplot2注释功能
p + annotate("text",label="Footnote",
x=unit(1,"npc") - unit(2, "mm"),y=unit(2, "mm"),
just=c("right", "bottom"),gp=gpar(cex= 0.7, col=grey(.5)))
Run Code Online (Sandbox Code Playgroud)
但是我收到错误"as.data.frame.default(x [[i]]中的错误,可选= TRUE,stringsAsFactors = stringsAsFactors):不能将类c("unit.arithmetic","unit")强制转换为data.frame".
我正在寻找一种绘制包含两个不同系列的条形图的方法,隐藏其中一个系列的条形图,而是有一条线(如果可能的话,光滑)穿过隐藏系列的条形顶部(类似于如何在直方图上叠加频率多项式).我试过下面的例子,但似乎遇到了两个问题.
首先,我需要按组总结(总计)数据,其次,我想将其中一个系列(df2)转换为一行.
df <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,1,2,2,3,3))
df2 <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,4,3,5,1,2))
ggplot(df, aes(x=grp, y=val)) +
geom_bar(stat="identity", alpha=0.75) +
geom_bar(data=df2, aes(x=grp, y=val), stat="identity", position="dodge")
Run Code Online (Sandbox Code Playgroud) 是否有可能改变单个分面图的格式?例如,使用下面的示例代码,可以更改cyl = 8图表的标题或背景颜色吗?
library(ggplot2)
ggplot(mtcars, aes(x=gear)) +
geom_bar(aes(y=gear), stat="identity", position="dodge") +
facet_wrap(~cyl)
Run Code Online (Sandbox Code Playgroud) 我正在使用pyodbc查询SQL Server数据库
import datetime
import pyodbc
conn = pyodbc.connect("Driver={SQL Server};Server='dbserver',Database='db',
TrustedConnection=Yes")
cursor = conn.cursor()
ratings = ("PG-13", "PG", "G")
st_dt = datetime(2010, 1, 1)
end_dt = datetime(2010, 12, 31)
cursor.execute("""Select title, director, producer From movies
Where rating In ? And release_dt Between ? And ?""",
ratings, str(st_dt), str(end_dt))
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误.元组参数是否需要以不同的方式处理?有没有更好的方法来构建此查询?
('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Line 9:
Incorrect syntax near '@P1'. (170) (SQLExecDirectW);
[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]
Statement(s) could not be prepared. (8180)")
Run Code Online (Sandbox Code Playgroud)
更新:
我能够使用字符串格式化运算符使这个查询工作,这不是理想的,因为它引入了安全性问题.
import datetime
import …
Run Code Online (Sandbox Code Playgroud) 我roll=-Inf
在定义时遇到了麻烦rollends=FALSE
.如果rollends
未设置或设置为TRUE
,则会看到预期结果.我将不胜感激任何建议.
library(data.table)
dt1 = data.table(Date=seq(from=as.Date("2013-01-03"),
to=as.Date("2013-06-27"), by="1 week"),
key="Date")[, ind:=.I]
dt2 = data.table(Date=seq(from=as.Date("2013-01-01"),
to=as.Date("2013-06-30"), by="1 day"),
key="Date")
Run Code Online (Sandbox Code Playgroud)
我希望在下面的输出中看到2013-01-05
并2013-06-26
填充.
dt1[dt2, roll=-Inf, rollends=FALSE]
Date ind
1: 2013-01-01 NA
2: 2013-01-02 NA
3: 2013-01-03 1
4: 2013-01-04 2
5: 2013-01-05 NA
---
177: 2013-06-26 NA
178: 2013-06-27 26
179: 2013-06-28 NA
180: 2013-06-29 NA
181: 2013-06-30 NA
Run Code Online (Sandbox Code Playgroud)
这是按预期工作的,ind
数据是前滚的,但不是在定义的端点之外dt1
data.table
.
dt1[dt2, roll=-Inf]
Date ind
1: 2013-01-01 1
2: …
Run Code Online (Sandbox Code Playgroud) 我试图用来data.table
匹配向量中最接近的十进制值,但遇到的情况是返回多个结果.下面的简化示例返回两个值,0.1818182 0.2727273
但是使用不太精确的值x
(例如0.0275
)返回单个match(0.1818182
).
x = 0.0275016249293408
dt = data.table(rnk = c(0, 0.0909090909090909,
0.181818181818182, 0.272727272727273),
val = c(0.0233775088495975, 0.0270831481152598,
0.0275016216267234, 0.0275016249293408),
key="val")
dt[J(x), roll="nearest"][, ifelse(is.na(val), NA_real_, rnk)]
Run Code Online (Sandbox Code Playgroud)
我假设问题与我用于此比较的数值的精度有关.可以用于最近匹配的小数精度是否有限制(即我需要舍入数据点)?有没有更好的方法来完成这个最接近的比赛?
我想将背景网格添加到绘图的中心,然后隐藏标准网格线.网格的角点存储在pts数据框中,我尝试使用geom_tile,但它似乎没有使用指定的点.在此先感谢您的帮助.
library(ggplot2)
pts <- data.frame(
x=c(170,170,170,177.5,177.5,177.5,185,185,185),
y=c(-35,-25,-15,-35,-25,-15,-35,-25,-15))
ggplot(quakes, aes(long, lat)) +
geom_point(shape = 1) +
geom_tile(data=pts,aes(x=x,y=y),fill="transparent",colour="black") +
opts(
panel.grid.major=theme_blank(),
panel.grid.minor=theme_blank()
)
Run Code Online (Sandbox Code Playgroud)