关于 r:多行图例文本,包括带有 ggplot 的指数

Multi-line legend text including exponent with ggplot

使用 ggplot,我想在文本中添加一个左对齐的图例标题,其中包含多行和指数,用于图例中值的单位。我正在绘制类似于以下形式的数据:

1
2
3
4
5
6
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() 将指数添加到图例中的单位。以下代码生成所需的图形,但图例标题文本格式错误。

1
2
3
4
5
6
7
8
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\
at 75 Pa\
(L/s-', m^2, ')', sep=''))) +
  theme(panel.grid.major.x = element_blank(),
        axis.title.x = element_blank())

图例标题左对齐,除了最后一行,中间有一堆多余的空格。

Three

您可以使用上标二 (U 00B2) 的 unicode 表示并避免
expression() 和多行图例标题的组合导致问题:

1
2
3
4
5
6
7
8
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\
at 75 Pa\
(L/s-m\\u00b2)', sep='')) +
  theme(panel.grid.major.x = element_blank(),
        axis.title.x = element_blank())

Plot


您可以使用 atop 让线条彼此"重叠"。

因为你有 3 行并且 atop 只接受 2 个参数,但是你需要有 2 个 atop 相互嵌套。这使得某些行上的字体更小。防止这种情况的方法是将表达式传递给 textstyledisplaystyle:

1
2
3
4
5
6
7
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