在单个面板数据图中绘制多个中位数

Plotting multiple medians in a single plot of panel data

我有一个包含 600 名受访者的数据集。对于 2013 年、2014 年、2015 年、2016 年、2017 年这 5 年的 600 名受访者,我都有一些指标值。此外,我为每个受访者都有一个城市栏。我想创建一个图 - 我使用折线图为 600 名受访者中的每一个绘制指标 - 每个受访者一个折线图,这样 Y 轴有指标值,X 轴有年份。我已经按城市分开了线图的颜色。此外,我想添加一条单独的中值指示线,以便每个城市的受访者都有一条中值线。我能够创建一条合并的中值线,但如果我尝试绘制多个中值,则会出现错误。这是我正在使用的代码 -

library(ggplot2)
library(dplyr)
library(tidyr)
library(magrittr)

sample_no <- c(1:600)
city <- c(rep("A",150), rep("B",250), rep("C", 200))
indicator_2013 <- runif(600, min=0, max=1000)
indicator_2014 <- runif(600, min=0, max=1000)
indicator_2015 <- runif(600, min=0, max=1000)
indicator_2016 <- runif(600, min=0, max=1000)
indicator_2017 <- runif(600, min=0, max=1000)

df <- data.frame(sample_no, city, indicator_2013, indicator_2014, indicator_2015, indicator_2016, indicator_2017)
df1 <- df %>%
  gather(indicator_2013, indicator_2014, indicator_2015, indicator_2016, indicator_2017, key="Year", value = "Indicator")

df1 %>%
  ggplot(aes(x=Year, y=Indicator, color=as.factor(city))) +
  geom_line(aes(group = sample_no), alpha = .5, size = 0.7) +
  labs(col = "City") +
  stat_summary(aes(y = Indicator, group =1), fun.y=median, geom = "line", color = "black", size = 1)

注意:这只是虚拟数据,因此图表是对称的... 我尝试使用以下代码制作多条中线,但出现错误 - 错误:美学必须为长度 1 或与数据相同 (5):颜色、尺寸

stat_summary(aes(y = Indicator, group =1), fun.y=median, colour=city, geom="line", size =1)

我四处寻找文档和其他 R 博客文章,但没有找到有用的东西。

如果我理解正确,你只需要将 group 参数更改为城市而不是 1:

stat_summary(aes(y = Indicator, group =city)...

完整代码:

library(ggplot2)
library(dplyr)
library(tidyr)
library(magrittr)
sample_no <- c(1:600)
city <- c(rep("A",150), rep("B",250), rep("C", 200))
indicator_2013 <- runif(600, min=0, max=1000)
indicator_2014 <- runif(600, min=0, max=1000)
indicator_2015 <- runif(600, min=0, max=1000)
indicator_2016 <- runif(600, min=0, max=1000)
indicator_2017 <- runif(600, min=0, max=1000)
df <- data.frame(sample_no, city, indicator_2013, indicator_2014, indicator_2015, indicator_2016, indicator_2017)
df1 <- df %>%
  gather(indicator_2013, indicator_2014, indicator_2015, indicator_2016, indicator_2017, key="Year", value = "Indicator")
df1 %>%
  ggplot(aes(x=Year, y=Indicator, color=as.factor(city))) +
  geom_line(aes(group = sample_no), alpha = .5, size = 0.7) +
  labs(col = "City") +
  stat_summary(aes(y = Indicator, group =city), fun.y=median, geom = "line", color = "black", size = 1)

另外如果你使用变量名如column:city,颜色参数不能在aes()之外,如果你想要按城市着色的线条:

stat_summary(aes(y = Indicator, group =city, color = city), fun.y=median, geom="line", size =1)

[在评论中回答问题]

完整代码如下:

library(ggplot2)
library(dplyr)
library(tidyr)
library(magrittr)
sample_no <- c(1:600)
city <- c(rep("A",150), rep("B",250), rep("C", 200))
indicator_2013 <- runif(600, min=0, max=1000)
indicator_2014 <- runif(600, min=0, max=1000)
indicator_2015 <- runif(600, min=0, max=1000)
indicator_2016 <- runif(600, min=0, max=1000)
indicator_2017 <- runif(600, min=0, max=1000)
df <- data.frame(sample_no, city, indicator_2013, indicator_2014, indicator_2015, indicator_2016, indicator_2017)
df1 <- df %>%
  gather(indicator_2013, indicator_2014, indicator_2015, indicator_2016, indicator_2017, key="Year", value = "Indicator")
df1 %>%
  ggplot(aes(x=Year, y=Indicator, color=as.factor(city))) +
  geom_line(aes(group = sample_no), alpha = .5, size = 0.7) +
  labs(col = "City") +
  stat_summary(aes(y = Indicator, group =city), fun.y=median, geom = "line", color = "black", size = 1) + scale_x_discrete(expand=c(0,0)) 

您只需添加 scale_x_discrete(expand=c(0,0)) 即可删除空格并从第一个因子水平开始 x 轴。