如何在堆积条形图(Dplyr)上叠加折线图?
How to overlay a linegraph over a stacked bar plot (Dplyr)?
我正在创建一个堆积条形图,显示多年来样本的政党偏好变化。尽管该部分已完成,但我想在条形图上绘制一个折线图,以查看与上一年相比发生变化的样本百分比。
我目前绘制了两个单独的堆叠条形图,但我认为它们合二为一会更好看。
我的数据是这样的:
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")
ggplot(df, aes(fill = PolParty, y = pidp, x = wave)) +
geom_bar(stat="identity", position = "fill") +
xlab("Year") +
ylab("% of Sample") +
理想情况下,我想以折线图的形式将第一张图覆盖在第二张图上。轴是相同的,所以我认为这不是问题,但我不知道如何将堆叠条形图转换为折线图。
有了完整的数据集,我们会得到更准确地反映问题的答案;但作为一种快速而肮脏的解决方案,您需要使用类似于下面的代码。
我更改了名称以使发生的事情更清楚。我假设 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 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")
ggplot(df, aes(fill = PolParty, y = pidp, x = wave)) +
geom_bar(stat="identity", position = "fill") +
xlab("Year") +
ylab("% of Sample") +
理想情况下,我想以折线图的形式将第一张图覆盖在第二张图上。轴是相同的,所以我认为这不是问题,但我不知道如何将堆叠条形图转换为折线图。
有了完整的数据集,我们会得到更准确地反映问题的答案;但作为一种快速而肮脏的解决方案,您需要使用类似于下面的代码。
我更改了名称以使发生的事情更清楚。我假设 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).