有没有办法来改变图例项之间的间距GGPLOT2?有没有办法来改变图例项之间的间距GGPLOT2?(I

2019-06-14 16:26发布

有没有办法来改变图例项之间的间距GGPLOT2? 我现在有

legend.position ="top" 

它自动产生水平图例。 然而,该项目的间距非常接近,我想知道如何空间他们相距较远。

Answer 1:

我认为最好的办法是使用guide_legendguides

p + guides(fill=guide_legend(
                 keywidth=0.1,
                 keyheight=0.1,
                 default.unit="inch")
      )

注意使用的default.unit ,无需加载grid包。



Answer 2:

ggplot2 v3.0.0于2018年7月发布的有工作选项修改legend.spacing.xlegend.spacing.ylegend.text

例子:增加图例键之间的水平间距

library(ggplot2)

ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) + 
  geom_bar() +
  coord_flip() +
  scale_fill_viridis_d("Cyl") +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(1.0, 'cm'))

注意:如果你只是想扩大间距传说文本的右侧,使用stringr::str_pad()

实施例:移动图例键标签至底部,并增加垂直间距

ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) + 
  geom_bar() +
  coord_flip() +
  scale_fill_viridis_d("Cyl") +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(1.0, 'cm'),
        legend.text = element_text(margin = margin(t = 10))) +
  guides(fill = guide_legend(title = "Cyl",
    label.position = "bottom",
    title.position = "left", title.vjust = 1)) 

例如: scale_fill_xxxguide_colorbar

ggplot(mtcars, aes(mpg, wt)) +
  geom_point(aes(fill = hp), pch = I(21), size = 5)+
  scale_fill_viridis_c(guide = FALSE) +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(0.5, 'cm'),
        legend.text = element_text(margin = margin(t = 10))) +
  guides(fill = guide_colorbar(title = "HP",
                             label.position = "bottom",
                             title.position = "left", title.vjust = 1,
                             # draw border around the legend
                             frame.colour = "black",
                             barwidth = 15,
                             barheight = 1.5)) 


对于垂直传说 ,设置legend.key.size不仅增加了传说按键的大小,而不是它们之间的垂直空间

ggplot(mtcars) +
  aes(fill = factor(cyl), x = cyl) +
  geom_bar() +
  theme(legend.key.size = unit(1, "cm"))

为了增加说明的键之间的距离,所述的修改legend-draw.r需要的功能。 看到这个问题的更多信息

# function to increase vertical spacing between legend keys
# @clauswilke
draw_key_polygon3 <- function(data, params, size) {
  lwd <- min(data$size, min(size) / 4)

  grid::rectGrob(
    width = grid::unit(0.6, "npc"),
    height = grid::unit(0.6, "npc"),
    gp = grid::gpar(
      col = data$colour,
      fill = alpha(data$fill, data$alpha),
      lty = data$linetype,
      lwd = lwd * .pt,
      linejoin = "mitre"
    ))
}

# register new key drawing function, 
# the effect is global & persistent throughout the R session
GeomBar$draw_key = draw_key_polygon3

ggplot(mtcars) +
  aes(fill = factor(cyl), x = cyl) +
  geom_bar() +
  theme(legend.key = element_rect(color = NA, fill = NA),
        legend.key.size = unit(1.5, "cm"))



Answer 3:

我用来水平传说添加空间一个简单的修复,只需在标签中添加空格(见下文节选):

  scale_fill_manual(values=c("red","blue","white"),
                    labels=c("Label of category 1          ",
                             "Label of category 2          ",
                             "Label of category 3"))


Answer 4:

现在, opts在被弃用ggplot2包,功能theme ,而应使用:

library(grid) # for unit()
... + theme(legend.key.height=unit(3,"line"))
... + theme(legend.key.width=unit(3,"line"))


Answer 5:

要在图例条目之间添加间隔,调整主题元件的边缘legend.text

要添加的空间30pt到每个图例标签的右侧(可以是用于水平图例有用):

p + theme(legend.text = element_text(
    margin = margin(r = 30, unit = "pt")))

要添加的空间30pt到每个图例标签的左侧(可以是用于垂直图例有用):

p + theme(legend.text = element_text(
    margin = margin(l = 30, unit = "pt")))

用于ggplot2对象p 。 关键字是legend.textmargin

[备注编辑:如果这个答案是先贴,有一个错误。 该错误已得到修复]



Answer 6:

从Koshke对GGPLOT2工作和他的博客( Koshke的博客 )

... + theme(legend.key.height=unit(3,"line")) # Change 3 to X
... + theme(legend.key.width=unit(3,"line")) # Change 3 to X

键入theme_get()在控制台中看到其他编辑的传说属性。



Answer 7:

看起来像(2018年)的最佳方法是使用legend.key.sizetheme对象。 (例如,参见这里 )。

#Set-up:
    library(ggplot2)
    library(gridExtra)

    gp <- ggplot(data = mtcars, aes(mpg, cyl, colour = factor(cyl))) +
        geom_point()

这是真正的容易,如果你使用的是theme_bw()

  gpbw <- gp + theme_bw()

#Change spacing size:

  g1bw <- gpbw + theme(legend.key.size = unit(0, 'lines'))
  g2bw <- gpbw + theme(legend.key.size = unit(1.5, 'lines'))
  g3bw <- gpbw + theme(legend.key.size = unit(3, 'lines'))

  grid.arrange(g1bw,g2bw,g3bw,nrow=3)

然而,这并不工作这么好,否则 (例如,如果你需要在你的传奇号的灰色背景):

  g1 <- gp + theme(legend.key.size = unit(0, 'lines'))
  g2 <- gp + theme(legend.key.size = unit(1.5, 'lines'))
  g3 <- gp + theme(legend.key.size = unit(3, 'lines'))

  grid.arrange(g1,g2,g3,nrow=3)

#Notice that the legend symbol squares get bigger (that's what legend.key.size does). 

#Let's [indirectly] "control" that, too:
  gp2 <- g3
  g4 <- gp2 + theme(legend.key = element_rect(size = 1))
  g5 <- gp2 + theme(legend.key = element_rect(size = 3))
  g6 <- gp2 + theme(legend.key = element_rect(size = 10))

  grid.arrange(g4,g5,g6,nrow=3)   #see picture below, left

请注意,白色方块开始阻塞图例标题(和最终图形本身,如果我们不断增加的价值)。

  #This shows you why:
    gt <- gp2 + theme(legend.key = element_rect(size = 10,color = 'yellow' ))

我还没有完全找到一个变通固定上述问题...让我知道在评论,如果你有一个想法,我会相应地更新!

  • 我不知道是否有某种方式重新层中使用的东西$layers ...


Answer 8:

使用任何这些

legend.spacing = unit(1,"cm")
legend.spacing.x = unit(1,"cm")
legend.spacing.y = unit(1,"cm")


文章来源: Is there a way to change the spacing between legend items in ggplot2?
标签: r ggplot2 legend