ggplot bug?如何删除条形图的图例键之间的空格

时间:2016-01-07 13:20:32

标签: r ggplot2 legend

注意:我在与Mike讨论之后更新了这篇文章,因为我的问题可能表明ggplot中存在错误。基本上,以前我能够使用ggplot创建一个条形图,而图例键之间没有空格(图2是其示例输出,Link 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")

我遇到的问题是ggplot似乎会自动在两个图例键之间创建空间。

图1

enter image description here

有没有办法在图例键之间删除此空格。请参阅下面的图2,了解我想要做的事情。

图2

enter image description here

类似的问题已经被问到see Link 1,其目的是在图例键之间创建更多空间,但不幸的是,没有一个答案帮助我解决了我的问题(即,删除了之间的空间)传奇键)。

我还遇到了一个链接,其中条形图表示似乎可以删除图例键之间的空格:Link 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")

任何有关如何解决此问题的建议都将受到欢迎。顺便说一句,增加更多空间对我来说也是一个潜在的解决方案,但正如前一篇文章(链接1)所见,这在ggplot中可能并不容易实现。

开始修改

为了完整起见,我粘贴在原始的ggplot脚本中,该脚本用于生成图例键之间没有空格的图例(图2是使用此脚本创建的 - 图2中省略了条形图等,如这个问题只与传说有关):

对于summarySE函数,see Link 3

slc <- summarySE(sl, measurevar="EStroop.ART", groupvars=c("Etarget","Econgruency"), na.rm=T)

ggplot(data=slc, aes(x=Etarget, y=EStroop.ART, fill=Econgruency))+ 
  geom_bar()+
  geom_bar(stat="identity", position=position_dodge(), colour="black",     show_guide=FALSE, size=0.15)+
  geom_errorbar(aes(ymin=EStroop.ART-ci, ymax=EStroop.ART+ci),
                width=0.2, # Width of the error bars
                position=position_dodge(.9), size=0.15)+
  labs(x="Target", y="Adjusted Reaction Time (milliseconds)")+ #set other    titles 
  scale_fill_manual(values=c("grey", "white"))+
  theme(axis.title.x = element_text(face="bold", vjust=0.1, size =6),
        axis.title.y = element_text(face="bold", vjust=1.0, size =6),
        axis.text.x = element_text(size = 5, colour="black"),
        axis.text.y = element_text(size = 5, colour="black"),
        legend.key = element_rect(colour = 'black', size=.2), # to change border of the legend box
        legend.text=element_text(size = 4),
        legend.title=element_blank(),
        panel.grid.major = element_line(size=.20),
        panel.grid.minor = element_line(size=.1),
        axis.ticks=element_line(size=.2),
        axis.line=element_line(colour="black", size=0.15),
        legend.key.size = unit(.3, "cm"))+ # size of legend box
  coord_cartesian(ylim=c(500,700)) # to "zoom" in on the graph 
ggsave("ES_cong.tiff", width=86, height=60, units='mm', dpi=1200)  

结束修改

1 个答案:

答案 0 :(得分:1)

这可以通过cowplot软件包中的library(ggplot2) library(cowplot) 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 = mean, geom = "bar", position = "dodge", colour = "black", size = 0.2, key_glyph = rectangle_key_glyph( colour = "black" ) ) + scale_fill_manual(values = c("grey", "white")) + theme(legend.key = element_blank()) 函数来解决。它具有一个选项,可以设置所需的精确填充,可以是正数或负数。

默认情况下,没有间隙。这会使框周围的两条线并排绘制,这意味着它们看起来更粗。这可能不是您想要的。

ggplot(dft, aes(b, c, fill = b))+
  stat_summary(
    fun = mean, geom = "bar", position = "dodge", 
    colour = "black", size = 0.2,
    key_glyph = rectangle_key_glyph(
      colour = "black",
      padding = margin(3, 3, 3, 3)
    )
  ) +
  scale_fill_manual(values = c("grey", "white")) +
  theme(legend.key = element_blank())

我的首选解决方案是扩大差距,因此很明显。

size = 2

但是,您也可以使用负填充来使线条完全位于中间。这里用ggplot(dft, aes(b, c, fill = b))+ stat_summary( fun = mean, geom = "bar", position = "dodge", colour = "black", size = 2, key_glyph = rectangle_key_glyph( colour = "black", padding = margin(-2, -2, -2, -2) ) ) + scale_fill_manual(values = c("grey", "white")) + theme(legend.key = element_blank()) 来放大效果。

legend.key = element_blank()

请注意,在所有这些情况下,我都设置了In [63]: a = np.arange(1,10).reshape(3,3) 。我们不希望在图例键下方绘制任何内容。当您使用正填充时,这一点尤其重要。