【问题标题】:How to align the legend box to the middle of legend title in ggplot2?如何将图例框与 ggplot2 中图例标题的中间对齐?
【发布时间】:2018-03-19 11:15:25
【问题描述】:

默认情况下,图例框/键与图例标题的左侧对齐。由于我的图例标题很长,因此我想将其对齐到中心。我试过themeguide_legend 没有任何成功。任何建议将不胜感激。谢谢!

  • 数据

    df <- structure(list(Flow = c(0.992762, 0.802408, 0.9826, 0.754863, 
            0.174542, 0.056777), Coef = c(0.62, 0.49, 0.38, 0.59, 0.25, 0.67
            ), VeryLongLegendTitle = c(4.47680710313542, 18.8500193246859, 
            5.82742564783431, 23.3217237977105, 13.0155332302148, 88.4960885143824
            )), class = "data.frame", row.names = c(NA, -6L), .Names = c("Flow", 
            "Coef", "VeryLongLegendTitle"))
    
  • 代码

    library(ggplot2)
    p1 <- ggplot(df, aes(x = Flow, y = Coef, color = VeryLongLegendTitle)) +
      xlab(NULL) + scale_x_continuous(limits = c(0.0, 1.0), breaks = c(0.25, 0.75)) +
      geom_point(size = 2, alpha = 0.8) + 
      theme_bw(base_size = 14) +
      theme(axis.text.x = element_text(angle = 0, vjust = 0.5))
    p1
    
    p1 + theme(legend.title.align = 0.5) 
    p1 + theme(legend.title = element_text(hjust = 0.5))
    p1 + guides(color = guide_legend(title.hjust = 0.5))
    
  • 情节

【问题讨论】:

  • 您会考虑使用横向图例吗?似乎垂直尝试这样做会不必要地复杂,更不用说浪费图形空间了。
  • @www:如果我只需要一个情节,我会的。然而,我的最终情节由大约 16 个(4x4)小块组成。情节的每一行都有不同的图例。把图例放在右边是我唯一的选择。谢谢!

标签: r ggplot2 legend legend-properties


【解决方案1】:

借用这个workaround的解决方案

library(ggplot2)
library(gtable)
library(grid)

long1 <- ggplot(df, aes(x = Flow, y = Coef, color = VeryLongLegendTitle)) +
  xlab(NULL) + scale_x_continuous(limits = c(0.0, 1.0), breaks = c(0.25, 0.75)) +
  geom_point(size = 2, alpha = 0.8) + 
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 0, vjust = 0.5))

# extract legend
g <- ggplotGrob(long1)
grobs <- g$grobs
legend_index <- which(sapply(grobs, function(x) x$name) == "guide-box")
legend <- grobs[[legend_index]]

# extract guides table
guides_index <- which(sapply(legend$grobs, function(x) x$name) == "layout")
guides <- legend$grobs[[guides_index]]

# add extra column for spacing
# guides$width[5] is the extra spacing from the end of the legend text
# to the end of the legend title. If we instead distribute it 50:50 on
# both sides, we get a centered legend
guides <- gtable_add_cols(guides, 0.5*guides$width[5], 1)
guides$widths[6] <- guides$widths[2]
title_index <- guides$layout$name == "title"
guides$layout$l[title_index] <- 2

# reconstruct legend and write back
legend$grobs[[guides_index]] <- guides
g$grobs[[legend_index]] <- legend

grid.newpage()
grid.draw(g)

reprex package (v0.2.0) 于 2018 年 3 月 18 日创建。

【讨论】:

    【解决方案2】:

    我同意@www,但你可以试试p1 + guides(color = guide_legend(keywidth = 5, keyheight = 2))。它会产生这样的东西:

    看看Legend guide也不错。

    【讨论】:

    • 感谢您的链接!我已经看过那个了,theme。奇怪ggplot2里面有这样的选项
    • 不客气!你也可以put the title on two lines
    • 再次感谢!不幸的是,传说只是一个很长的词
    • 仅供参考,有一个使用gtable的解决方法我刚刚添加为答案
    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2020-06-01
    相关资源
    最近更新 更多