【问题标题】:How to overlay a linegraph over a stacked bar plot (Dplyr)?如何在堆积条形图(Dplyr)上叠加折线图?
【发布时间】:2019-04-08 20:54:37
【问题描述】:

我正在创建一个堆积条形图,显示多年来样本的政党偏好变化。虽然这部分已经完成,但我想在条形图上绘制一个折线图,查看与上一年相比发生变化的样本百分比。

我目前绘制了两个独立的堆叠条形图,但我认为将它们融合为一个会更好。

我的数据如下所示:

ID   Year   Party  Change
1    2010   Labour  NA
1    2011   Labour  No Change
1    2012   Con     Change
1    2013   Con     No Change
2    2010   Con     No Change
2    2011   Con     No Change
2    2012   Con     No Change
2    2013   Con     No Change
... etc.

这些是我已经绘制的图表。

library(dplyr)
library(ggplot2)

df %>%
  group_by(Change) %>%
  filter(Year != 2010) %>%
  ggplot(aes(fill = Change, y = ID, x= Year)) + 
    geom_bar(stat="identity", position = "fill") +
    xlab("Year") +
    ylab("% of Sample") 

https://imgur.com/lhCoXaR


ggplot(df, aes(fill = PolParty, y = pidp, x = wave)) + 
    geom_bar(stat="identity", position = "fill") +
  xlab("Year") +
  ylab("% of Sample") +

https://imgur.com/0qbIL5h

理想情况下,我希望以折线图的形式将第一个图形覆盖在第二个图形上。轴是相同的,所以我认为这不是问题,但我不知道如何将堆叠的条形图转换为折线图。

【问题讨论】:

  • wave 变量从何而来?它与另一个 x 轴 YEar 不同吗?
  • 浪潮是一年,对此我深表歉意。我认为说年份会更清楚,因为这就是它的意思。

标签: r ggplot2 dplyr stacked-chart linegraph


【解决方案1】:

有了完整的数据集,我们会得到一个更准确地反映问题的答案;但作为一种快速而肮脏的解决方案,您可能希望使用如下代码。

我已经更改了名称,以便更清楚地了解发生了什么。我假设df 实际上具有您提到的所有变量。可能最好将相关变量整理成两个单独的数据帧,然后分别将它们传递给每个geom_

library(dplyr)
library(ggplot2)

data <- "ID   Year   Party  Changed_seats
1    2010   Labour  NA
1    2011   Labour  No_Change
1    2012   Con     Change
1    2013   Con     No_Change
2    2010   Con     No_Change
2    2011   Con     No_Change
2    2012   Con     No_Change
2    2013   Con     No_Change
3    2014   Con     No_Change
3    2015   Con     Change
3    2016   Con     Change
3    2017   Con     No_Change
4    2014   Con     No_Change
4    2015   Con     Change
4    2016   Con     Change
4    2017   Con     No_Change"

df <- read.table(text = data, header = TRUE) 


seat_changes_df <- df %>%
  select(Year, Changed_seats) %>%
  mutate(Year = as.factor(Year)) %>%
  group_by(Year) %>%
  mutate(Prop_change = sum(Changed_seats == "Change")/n())

ggplot() + 
  geom_line(data = seat_changes_df, aes(x = Year, y = Prop_change), group = 1) +
  scale_y_continuous(labels = scales::percent) +
  xlab("Year") +
  ylab("Seats changed")
#> Warning: Removed 2 rows containing missing values (geom_path).

【讨论】:

  • 非常感谢,这太不可思议了。我觉得这应该可以工作,但由于某种原因,我的控制台会自动“添加缺少的分组变量:id”。我怎样才能禁用它?目前的输出只是绘制一条水平线。
  • 在您将id 放入group_by 调用之前的某个时间点,无论是按名称(这应该是显而易见的)还是按位置(group_by(1:3),即更阴险)。在进一步操作之前,您可能需要ungroup() 或重新考虑是否需要按id 分组。
猜你喜欢
  • 1970-01-01
  • 2016-02-22
  • 2021-03-21
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多