将两列绘制为条形图,将第三列绘制为折线图 ggplot

Mos*_*hee 3 r ggplot2 tidyr

我的 df 看起来像这样:

df <- data.frame(date = c('2016-01-01', '2017-01-01', '2018-01-01', '2019-01-01'),
                 "alo" = c(10, 11, 12.5, 9),
                 "bor" = c(18, 20, 23, 19),
                 "car" = c(100, 125, 110, 102)) %>%
  gather(-date, key = "key", value = "value")
Run Code Online (Sandbox Code Playgroud)

我想将 alo 和 bor 列绘制为同一图上的两个条形图,因此我收集了 df。但是,我希望汽车列作为折线图而不是同一图上的条形图。

目前,我的绘图代码是:

ggplot(df, aes(date, value, fill = key)) +
           geom_bar(stat = 'identity', position = "dodge")
Run Code Online (Sandbox Code Playgroud)

请建议我如何为第三列而不是条添加折线图。谢谢!

Axe*_*man 6

gather条形图中只有您想要的列:

df <- data.frame(date = c('2016-01-01', '2017-01-01', '2018-01-01', '2019-01-01'),
                 "alo" = c(10, 11, 12.5, 9),
                 "bor" = c(18, 20, 23, 19),
                 "car" = c(100, 125, 110, 102)) %>%
  gather(alo, bor, key = "key", value = "value")

ggplot(df, aes(date)) +
  geom_col(aes(y = value, fill = key), position = "dodge") +
  geom_line(aes(y = car, group = 1))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果你想car在你的图例中添加一个标签,做一些诡计:

ggplot(df, aes(date)) +
  geom_col(aes(y = value, fill = key), position = "dodge") +
  geom_line(aes(y = car, group = 1, col = 'car')) +
  scale_color_manual(values = 'black') +
  labs(color = NULL, fill = NULL)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • @Moshee我会坚持上面的解决方案,但是如果你“收集”所有列,那么你可以使用适当的数据子集传递给“geom_col”和“geom_line”。如:`ggplot() + geom_col(data = df %&gt;% filter(key != "car"), aes(date, value, fill = key),position = "dodge") + geom_line(data = df %&gt; %过滤器(键==“汽车”),aes(日期,值,组= 1))` (2认同)
  • @AntoniosK,作为进一步的技巧,您实际上可以将函数传递给 data 参数,这意味着您可以使用例如 `geom_col(data = . %&gt;% filter(key != "car") .....`,所以你不必多次定义你的 data.frame 。 (2认同)