有没有办法geom_bar()在下面的时间序列示例中丢失数据的情况下设置恒定宽度?我试过设置width在aes()没有运气.在代码示例下方的图中比较5月'11至6月'11的条形宽度.
colours <- c("#FF0000", "#33CC33", "#CCCCCC", "#FFA500", "#000000" )
iris$Month <- rep(seq(from=as.Date("2011-01-01"), to=as.Date("2011-10-01"), by="month"), 15)
colours <- c("#FF0000", "#33CC33", "#CCCCCC", "#FFA500", "#000000" )
iris$Month <- rep(seq(from=as.Date("2011-01-01"), to=as.Date("2011-10-01"), by="month"), 15)
d<-aggregate(iris$Sepal.Length, by=list(iris$Month, iris$Species), sum)
d$quota<-seq(from=2000, to=60000, by=2000)
colnames(d) <- c("Month", "Species", "Sepal.Width", "Quota")
d$Sepal.Width<-d$Sepal.Width * 1000
g1 <- ggplot(data=d, aes(x=Month, y=Quota, color="Quota")) + geom_line(size=1)
g1 + geom_bar(data=d[c(-1:-5),], aes(x=Month, y=Sepal.Width, width=10, group=Species, fill=Species), stat="identity", position="dodge") + scale_fill_manual(values=colours)
Run Code Online (Sandbox Code Playgroud)

我正在尝试在ggplot上使用position_dodge来获取共享相同类别(cat)的两个不同信号(ind)的箱线图.当存在具有一个信号的数据但不存在另一个信号的数据的类别时,具有数据的信号的箱图表覆盖所有水平间距,并且不尊重该特定类别的position_dodge指令.有没有办法让ggplot强制执行躲避规则?正如您在下面的示例中所看到的,信号x没有类别B的数据,因此它会丢失position_dodge保留的空间.我想避免这种情况.
提前致谢.
data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'),
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9),
ind=c('x','x','x','x','x','x','y','y','y','y','y','y'))
print(ggplot() +
scale_colour_hue(guide='none') +
geom_boxplot(
aes(x=as.factor(cat), y=values,
fill=ind),
position=position_dodge(width=.60),
data=data,
outlier.size = 1.2,
na.rm=T))
Run Code Online (Sandbox Code Playgroud)

经过一些解决方法,我想出了我正在寻找的结果......(有点)
data <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'),
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0),
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x'))
p <- ggplot() +
scale_colour_hue(guide='none') +
geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind),
position=position_dodge(width=.60),
data=data,
outlier.size = 1.2,
na.rm=T) +
geom_line(aes(x=x, y=y),
data=data.frame(x=c(0,3),y=rep(0,2)),
size = 1,
col='white')
print(p)
Run Code Online (Sandbox Code Playgroud)

有些人使用刻面来重新设想我想要的效果.Faceting并没有给我正在寻找的效果.我正在寻找的最终图表如下所示:

如果您注意到,y = 10处的白色主刻度标记比其他刻度标记厚.这条较粗的线是大小= 1的geom_line,它隐藏了不需要的箱形图.
我希望我们能够更无缝地组合不同的geom对象.我把这报告为Hadley的github上的一个bug,但是Hadley说这就是position_dodge的设计行为.我想我正在以非标准的方式使用ggplot2,而解决方法是解决这些问题的方法.无论如何,我希望这有助于一些R人员进一步推动ggplot的功能.
我正在修改使用ggplot构建的图形,方法是更改ggplot_build生成的数据(原因类似于包含空间,因为geom_boxplot中填充美学中使用的缺失因子级别包含空间).据我所知,在这个主题上找到了帮助,我应该能够在结果上调用ggsave之前应用ggplot_gtable和arrangeGrob来保存结果(将grid.arrange()图保存到文件中).
然而,我得到一个错误"情节应该是一个ggplot2情节",也有这个简单的可再现的例子:
require('ggplot2')
require('gridExtra')
df <- data.frame(f1=factor(rbinom(100, 1, 0.45), label=c("m","w")),
f2=factor(rbinom(100, 1, 0.45), label=c("young","old")),
boxthis=rnorm(100))
g <- ggplot(aes(y = boxthis, x = f2, fill = f1), data = df) + geom_boxplot()
dd <- ggplot_build(g)
# Printing the graph works:
print(arrangeGrob(ggplot_gtable(dd)))
# Saving the graph doesn't:
ggsave('test.png',arrangeGrob(ggplot_gtable(dd)))
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么这不起作用?有没有办法在使用ggplot_build()修改数据后使用ggsave?
(我的软件包版本是gridExtra_0.9.1和ggplot2_0.9.3.1)
我想将“随机”类别中框的宽度调整为与图中其他框的宽度相同。它现在是一个组,而其他组包含两个子组......关于如何做到这一点的任何想法?
使用geom_boxplot(width=0.2)just 会更改所有框的宽度。到目前为止,我使用了以下代码:
ggplot(TablePerCatchmentAndYear,aes(x=NoiseType, y= POA, fill = TempRes)) +
geom_boxplot(lwd=0.05) + ylim(c(-1.25, 1)) + theme(legend.position='bottom') +
ggtitle('title')+ scale_fill_discrete(name = '')
Run Code Online (Sandbox Code Playgroud)
我为此使用的数据如下表:
TablePerCatchmentAndYear = structure(list(CatchmentModelType = c("2126_Murg_2009_dry_bench_hourly",
"2126_Murg_2009_dry_bench_hourly", "2126_Murg_2009_dry_bench_hourly",
"2126_Murg_2009_dry_bench_hourly", "2126_Murg_2009_dry_bench_hourly",
"2126_Murg_2009_dry_bench_hourly", "2126_Murg_2009_dry_bench_hourly",
"2126_Murg_2009_dry_bench_hourly", "2126_Murg_2009_dry_bench_hourly",
"2126_Murg_2009_dry_bench_hourly", "2126_Murg_2009_dry_LogNormSDdivBy4_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy4_hourly", "2126_Murg_2009_dry_LogNormSDdivBy4_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy4_hourly", "2126_Murg_2009_dry_LogNormSDdivBy4_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy4_hourly", "2126_Murg_2009_dry_LogNormSDdivBy4_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy4_hourly", "2126_Murg_2009_dry_LogNormSDdivBy4_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy4_hourly", "2126_Murg_2009_dry_LogNormSDdivBy2_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy2_hourly", "2126_Murg_2009_dry_LogNormSDdivBy2_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy2_hourly", "2126_Murg_2009_dry_LogNormSDdivBy2_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy2_hourly", "2126_Murg_2009_dry_LogNormSDdivBy2_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy2_hourly", "2126_Murg_2009_dry_LogNormSDdivBy2_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy2_hourly", "2126_Murg_2009_dry_LogNormSDdivBy1_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy1_hourly", "2126_Murg_2009_dry_LogNormSDdivBy1_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy1_hourly", "2126_Murg_2009_dry_LogNormSDdivBy1_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy1_hourly", "2126_Murg_2009_dry_LogNormSDdivBy1_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy1_hourly", "2126_Murg_2009_dry_LogNormSDdivBy1_hourly",
"2126_Murg_2009_dry_LogNormSDdivBy1_hourly", "2126_Murg_2009_dry_random_hourly",
"2126_Murg_2009_dry_random_hourly", "2126_Murg_2009_dry_random_hourly",
"2126_Murg_2009_dry_random_hourly", "2126_Murg_2009_dry_random_hourly",
"2126_Murg_2009_dry_random_hourly", "2126_Murg_2009_dry_random_hourly",
"2126_Murg_2009_dry_random_hourly", "2126_Murg_2009_dry_random_hourly",
"2126_Murg_2009_dry_random_hourly", "2126_Murg_2009_dry_bench_weekly",
"2126_Murg_2009_dry_bench_weekly", …Run Code Online (Sandbox Code Playgroud) 在ggplot2中,即使不存在给定的级别组合,我也希望方框图中的方框宽度相等。
例如,在mtcars中,cyl = 8和gear = 4不存在,这导致该图中的条形变大:
qplot(data=mtcars, x=as.factor(cyl), y=mpg,
colour=as.factor(gear), geom="boxplot")
Run Code Online (Sandbox Code Playgroud)

对于条形图,使用这些级别组合的NA值填充数据框可以解决问题,而对于箱形图则不能解决问题:
mtcars.fill <- data.frame(cyl=8,gear=4,mpg=NA)
mtcars <- rbind.fill(mtcars,mtcars.fill)
qplot(data=mtcars, x=as.factor(cyl), y=mpg, colour=as.factor(gear), geom="boxplot")
Warning message:
Removed 1 rows containing non-finite values (stat_boxplot).
Run Code Online (Sandbox Code Playgroud)
这导致了完全相同的情节。
stat_boxplot有一个用于na值的参数,但默认设置为不删除NA:
na.rm = FALSE
Run Code Online (Sandbox Code Playgroud) 这是我的data.frame():
df <- data.frame(Round = rep(c("A", "B", "C" ),150), Group = rep(c("UP", "DOWN"),75),Task = rep(c("T1", "T2", "T3", "T4", "T5"),30), V2 = sample(c(0,1,2), 50, replace = T), V1 = sample(c(0,1,2), 50, replace = T))
dfmelt <- melt(df)
Run Code Online (Sandbox Code Playgroud)
我想尝试这样的情节facet_grid:
b <- ggplot(data=dfmelt, aes(x=value, fill=variable))
b <- b + geom_bar(stat="count", position = "dodge", width = 0.9)
b <- b + facet_grid(Group ~ Task, scales = "free")
Run Code Online (Sandbox Code Playgroud)
,产生以下内容:
我想摆脱更广泛的列,例如V1 at the position 0 of T1-UP,V1 at the …