如何在ggplot2中去除图例键之间的空格

14

注意:在与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")

这个问题在于ggplot似乎自动在两个图例键之间创建了空间。 图1

enter image description here

有没有办法去掉图例键之间的空格。请参见下面的图2,了解我想要做的示例。
图2

enter image description here

已经有类似的问题请参见链接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")

如果有任何解决此问题的建议,将不胜感激。顺便说一句,增加更多的空间也可能是我需要的潜在解决方案,但正如先前的帖子所示(链接1),在ggplot中实现可能并不容易。


开始编辑

为了完整起见,我将粘贴我的原始ggplot脚本,该脚本用于生成一个没有图例键之间空格的图例(图2是使用此脚本创建的 - 图2中省略了柱形图等内容,因为此问题仅涉及图例):

有关summarySE函数,请参见链接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:https://dev59.com/Wmgu5IYBdhLWcg3wYWFX链接2:http://www.cookbook-r.com/Graphs/Bar_and_line_graphs_%28ggplot2%29/ - Tiberius
1
我把它放大了,你的示例高达2600像素,我看不到间隙。不过钥匙的左边线有点粗,这不应该出现。 - Mike Wise
顺便说一下,当您删除以下代码行时:“theme(legend.key = element_rect(colour ='black',size = .01))”,您会发现有一个间隙。然后,图例键应该由一条细白线清晰地分开。我想知道如何删除该行/间隙...我认为这与像素无关,因为我之前能够使用ggplot创建Figure 2。只是因为最近更新了ggplot,所以这个“旧”脚本不再起作用。旧脚本和新脚本之间的主要区别在于我在第二个代码行中添加了“geom_bar()+”-现在我收到了错误消息... - Tiberius
1
只需将 ggsave 中的 .jpg 替换为 .pdf.svg,即可更改要保存的文件类型。 - Gregor Thomas
1
相关 https://github.com/tidyverse/ggplot2/issues/2844 - Tung
显示剩余9条评论
1个回答

3

使用cowplot包中的rectangle_key_glyph()函数可以解决此问题。它有一个选项可以设置您想要的确切填充,可以是正数或负数。

默认情况下,没有间隔。这会导致框周围的两条线并排绘制,这意味着它们的外观更加粗壮。这可能不是您想要的。

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()。我们不希望在图例键下面绘制任何内容。当您使用正填充时,这尤为重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接