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

时间:2017-09-18 10:05:18

标签: r ggplot2 median

我有600名受访者的数据集。我对5个年份(2013年,2014年,2015年,2016年,2017年)的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博客文章,但没有找到有用的东西。

1 个答案:

答案 0 :(得分:1)

如果我理解正确你只需要将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轴。