多行图例文本,包括带ggplot的指数

时间:2018-11-18 19:30:19

标签: r ggplot2

对于ggplot,我想在图例中添加左对齐的图例标题,该图例标题中包含多行和指数,以图例中值的单位表示。我正在绘制类似于以下形式的数据:

leakage_rates_levels <- c(5.4, 0.25)
leakage_rates <- as.factor(rep(leakage_rates_levels, 3))  # L/s-m^2 at 75 Pa
data_groups_levels <- c('Set 1', 'Set 2', 'Set 3')
data_groups <- as.factor(rep(data_groups_levels, each=2))
moisture_level <- c(7, 3, 11, 10, 16, 6)
plotdt <- data.frame(data_groups, leakage_rates, moisture_level)

我使用expression()向图例中的单位添加指数。以下代码生成所需的图形,但图例标题文本的格式错误。

ggplot(plotdt, aes(data_groups)) +
  geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
  labs(y='Moisture Level') +
  labs(fill=expression(paste('Leakage Rate\nat 75 Pa\n(L/s-', m^2, ')', sep=''))) +
  theme(panel.grid.major.x = element_blank(),
        axis.title.x = element_blank())

图例标题显示为左对齐,但最后一行除外,其中最后一行中间有一堆多余的空格。

Three line legend text where the third line indicates the units, liters per second meter squared, but the meter squared term is pushed to the right margin while all the other text is left aligned, leaving a large white space in the middle of the third line.

legend_title_align=0中使用legend_title=element_text(hjust=1)(建议here)和/或theme()无效。尝试添加phantom()间距也不起作用(建议here)。 this question的最高答案的结尾指出了我遇到的相同问题,但未提出解决方案。

是否有办法使图例中的平方米项像其余文字一样向左对齐?

我正在使用ggplot 3.1.0和R 3.5.1。

2 个答案:

答案 0 :(得分:4)

您可以使用上标2(U + 00B2)的unicode表示,并避免使用 expression()和多行图例标题引起问题的组合:

ggplot(plotdt, aes(data_groups)) +
  geom_bar(aes(weight=moisture_level, fill=leakage_rates), position='dodge') +
  labs(y='Moisture Level') +
  labs(fill=paste('Leakage Rate\nat 75 Pa\n(L/s-m\u00b2)', sep='')) +
  theme(panel.grid.major.x = element_blank(),
        axis.title.x = element_blank())

Plot using Superscript

答案 1 :(得分:1)

您可以使用atop使行彼此“顶”。

因为您有3行,并且atop仅接受2个参数,所以您需要将2个atop嵌套在一起。这使某些行上的字体变小。防止这种情况的方法是将表达式传递到textstyledisplaystyle

ggplot(plotdt, aes(data_groups)) +
  geom_bar(aes(weight = moisture_level, fill = leakage_rates), position = "dodge") +
  labs(y = "Moisture Level") +
  labs(fill = expression(atop(atop(textstyle("Leakage Rate"),
                                   textstyle("at 75 Pa")),
                              "(L/s-" ~m^2~ ")"))) +
  theme(panel.grid.major.x = element_blank(), axis.title.x = element_blank())

enter image description here