我如何展示多层图例(geom_point 和 geom_bar)?

3
我有两个数据集,想将它们组合成一个图表,一个是条形图(2个组),一个是点线图(1个组)。我已经将这些图表组合起来,并显示了条形图的图例,但每当我尝试为点/线显示图例时,就失败了。
以下是我的数据集摘录:
bargroup <- data.frame('Year' = as.numeric(rep(2001:2004, each = 2)),
                     'Group' = as.factor(rep(c('State', 'Country'), 4)),
                     'Share' = as.numeric(c(0.42, 0.41, 0.4, 0.4, 0.42, 0.4, 0.42, 0.38)))

plgroup <- data.frame('Year' = as.numeric(2001:2004),
                             'Group' = as.factor(rep('State', 4)),
                             'Value' = as.numeric(c(4.95, 5.31, 5.29, 4.96)))

这是我的当前代码:

ggplot() +
geom_bar(data = bargroup, aes(x = Year, y = Share, fill = Group, group = Group),
           stat = 'identity', position = position_dodge2(preserve = 'single')) +
  geom_point(data = plgroup, aes(y = Value*0.1, x = Year), size = 4, color = '#875DA3') +
  geom_line(data = plgroup, aes(y = Value*0.1, x = Year), size = 1, color = '#875DA3') +
  labs(x = 'Year') +
  scale_y_continuous(name = 'Share groups', labels = scales::percent,
                     sec.axis = sec_axis(~.*10, name = 'Cost')) +
  scale_fill_manual(labels = c('Share State', 'Share Country'), 
                    values = c('#659B7A', '#8CD7F0')) +
  scale_color_manual(labels = c('Total Cost'), 
                values = c('#875DA3')) +
  theme_minimal() +
  theme(legend.title = element_blank(),
        legend.position = 'bottom',
        plot.title = element_blank(),
        panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text = element_text(size = 16),
        legend.text = element_text(size = 18)) +
  guides(fill = guide_legend(nrow = 2, byrow = T))
dev.off()

这是我得到的图表:

Graph 1

正如您所见,点/线组在图例中未显示。然后我尝试删除参数scale_color_manual(),并调整geom_point()和geom_line()参数,如下所示:
  geom_point(data = plgroup, aes(y = Value*0.1, x = Year, color = Group), 
             size = 4, color = '#875DA3', show.legend = T)
  geom_line(data = plgroup, aes(y = Value*0.1, x = Year, color = Group),
            size = 1, color = '#875DA3', show.legend = T)

我得到的图表是:

Graph 2

我使用melt()函数合并两个数据集后得到了同样的图形。
我还尝试将其分成3组,不显示点/线组。这样可以显示所有3个组,但不幸的是,点/线组现在被标记为一个正方形而不是它的点/线符号(在图例中)。 有没有人知道我如何调整我的代码,以便将点/线组显示为单个圆点,位于其他两个组旁边或下方?最好还能选择标签名称(“总成本”)。
非常感谢您的帮助!
1个回答

2

经验法则:在aes()中的所有内容都会生成图例。因此,将sizeaes()外移,并将color放在aes()中:

ggplot() +
  geom_bar(data = bargroup, aes(x = Year, y = Share, fill = Group, group = Group),
           stat = 'identity', position = position_dodge2(preserve = 'single')) +
  geom_point(data = plgroup, aes(y = Value*0.1, x = Year, color = '#875DA3'),size = 4) +
  geom_line(data = plgroup, aes(y = Value*0.1, x = Year, color = '#875DA3'),size = 1) +
  labs(x = 'Year') +
  scale_y_continuous(name = 'Share groups', labels = scales::percent,
                     sec.axis = sec_axis(~.*10, name = 'Cost')) +
  scale_fill_manual(labels = c('Share State', 'Share Country'), 
                    values = c('#659B7A', '#8CD7F0')) +
  scale_color_manual(labels = c('Total Cost'), 
                     values = c('#875DA3')) +
  theme_minimal() +
  theme(legend.title = element_blank(),
        legend.position = 'bottom',
        plot.title = element_blank(),
        panel.grid.minor = element_blank(),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text = element_text(size = 16),
        legend.text = element_text(size = 18)) +
  guides(fill = guide_legend(nrow = 2, byrow = T))

在此输入图片描述

更改图例顺序:

guides(fill = guide_legend(nrow = 2, byrow = T, order=1))

enter image description here


1
哦,太好了!非常感谢您的快速回复! 如果您知道的话,现在只需要一个更细节的问题:我能否将顺序颠倒,使得两个组在左侧,单个组在右侧? - Keni
1
只需像这样订购,将代码的最后一行替换为:guides(fill = guide_legend(nrow = 2, byrow = T, order = 1)) - TarJae

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