注意:我在与Mike讨论后更新了这篇文章,因为我的问题可能表明ggplot中存在错误.基本上,以前我能够使用ggplot在图例键之间创建一个没有空格的条形图(图2是其示例输出,与链接2一样).但是,现在,ggplot似乎会自动在图例键之间添加空格......
原帖
我想创建一个带有图例的条形图.我正在做的一个例子如下:
b <- c("A","A","A","B","B","B", "A","A","A","B","B","B", "A","A","A","B","B","B")
c <- c(11,22,33,99,88,77, 44,55,66,61,62,63, 83,85, 87, 84,86, 88)
dft <- data.frame(b,c)
ggplot(dft, aes(b,c, fill=b))+
stat_summary(fun.y=mean, geom="bar", position="dodge", colour="black", size=.2)+
scale_fill_manual(values=c("grey", "white"))+
theme(legend.key = element_rect(colour = 'black', size=.01))
ggsave("T3.jpg")
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是ggplot似乎在两个图例键之间自动创建空间.
图1
有没有办法在图例键之间删除此空格.请参阅下面的图2,了解我想要做的事情.
图2
类似的问题已经被问到了链接1,其目的是在图例键之间创建更多空间,但不幸的是,没有一个答案帮助我解决了我的问题(即,删除了图例键之间的空间).
我还遇到了一个链接,其中条形图表明似乎可以删除图例键之间的空格:链接2.但是,在将脚本调整到我的示例时,出现了完全相同的问题(图例键之间的空格).
为什么这个链接上的条形图显示没有空格,而当我尝试复制时,这个空间是否添加在图例键之间?我或许还应该补充一点,我最近更新了ggplot.这可能与此有关吗?
dft2<-ddply(dft,.(b),plyr::summarize, meanc = mean(c))
ggplot(data=dft2, aes(x=b, y=meanc, fill=b)) +
geom_bar(stat="identity",position=position_dodge(), colour="black", size=.3) +
scale_fill_manual(values=c("grey", "white")) +
theme(legend.key = element_rect(colour = 'black', size=.01))
ggsave("T2.jpg")
Run Code Online (Sandbox Code Playgroud)
任何有关如何解决此问题的建议都将受到欢迎.顺便说一句,增加更多空间对我来说也是一个潜在的解决方案,但正如前一篇文章(链接1)所见,这在ggplot中可能并不容易实现.
开始编辑
为了完整起见,我粘贴在我原来的ggplot脚本中,用于生成图例键之间没有空格的图例(图2是使用此脚本创建的 - 图2中省略了条等,因为这个问题是只涉及传说): …
注意:我在与Z. Lin讨论后更新了这篇文章.最初,我将我的问题简化为双因素设计(参见" 原始问题 "部分).但是,我的实际数据包含四个因素,需要facet_grid.因此,我在下面提供了一个四因素设计的示例(请参见" 编辑 " 部分).
原始问题
让我们假设我有一个双因素设计,dv作为我的因变量,iv.x和iv.y作为我的因子/自变量.一些快速的样本数据:
DF <- data.frame(dv = rnorm(900),
iv.x = sort(rep(letters[1:3], 300)),
iv.y = rep(sort(rep(rev(letters)[1:3], 100)), 3))
Run Code Online (Sandbox Code Playgroud)
我的目标是分别显示每个条件,就像小提琴图一样可以很好地完成:
ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_violin()
Run Code Online (Sandbox Code Playgroud)
我最近遇到了新浪的情节,我想在这里做同样的事情.不幸的是,新浪图不会这样做,而是折叠数据.
ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_sina()
Run Code Online (Sandbox Code Playgroud)
对位置闪避的显式调用也没有帮助,因为这会产生错误消息:
ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_sina(position = position_dodge(width = 0.5))
Run Code Online (Sandbox Code Playgroud)
新浪图的作者已经在2016年意识到这个问题:https: //github.com/thomasp85/ggforce/issues/47
我的问题更多的是时间问题.我们很快就想提交一份手稿,而新浪图则是展示我们数据的绝佳方式.任何人都可以想到新浪图的解决方法,这样我仍然可以显示两个因素,例如上面的小提琴情节?
编辑
四因素设计的样本数据:
DF <- data.frame(dv=rnorm(400),
iv.w=sort(rep(letters[1:2],200)),
iv.x=rep(sort(rep(letters[3:4],100)), 2),
iv.y=rep(sort(rep(rev(letters)[1:2],50)),4),
iv.z=rep(sort(rep(letters[5:6],25)),8))
Run Code Online (Sandbox Code Playgroud)
我想用新浪图创建的小提琴图的示例:
ggplot(DF, aes(iv.x, dv, colour=iv.y)) +
facet_grid(iv.w ~ iv.z) +
geom_violin(aes(y = dv, fill …Run Code Online (Sandbox Code Playgroud)