【问题标题】:Plotting multiple medians in a single plot of panel data在单个面板数据图中绘制多个中位数
【发布时间】:2018-02-26 20:01:42
【问题描述】:

我有一个包含 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 博客文章,但没有找到有用的东西。

【问题讨论】:

    标签: r ggplot2 median


    【解决方案1】:

    如果我理解正确,您只需将 group 参数更改为 city 而不是 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)
    

    另外如果您使用变量名称,例如列:城市,则颜色参数不能在 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 轴。

    【讨论】:

    • 感谢这完美的作品!我有两个后续问题 - 1. stat_summary 中的组有哪些不同的值?什么时候用1?我查了 ?stat_summary 但这并没有说太多。 2. 在使用此代码生成的图表中,在坐标 (0,0) 和第一个 x-asix 刻度标签之间浪费了大量绘图空间,在最后一个 x-asis 刻度标签和图表结束位置之间也是如此。如何减少这种情况?也许这应该是另一篇文章,但我查阅了很多 ggplot 文档但没有找到任何东西。
    • group = 1 表示您想要一条连接所有点的单线
    • 我已经在上面的主要答案中回答了你的第二个问题
    猜你喜欢
    • 2015-02-19
    • 2022-01-06
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多