R 通过美学映射在ggplot中显示各组内的统计摘要

R 通过美学映射在ggplot中显示各组内的统计摘要,r,ggplot2,grouping,R,Ggplot2,Grouping,我已经接近绘制我想要的图了,但还没有完全弄清楚stat\u summary是否是显示所需图的正确方式 所需输出为散点图,每个类别内每年有一条中间线。例如,在下面的图中,我希望a类中1999年、2000年和2001年的值有一条中间线(即3条颜色线),然后B类中的值相同(总共6条中间线) 我看了看,但这似乎没有达到我想要的,因为它使用了方面 我的情节看起来像是在每个类别的中间点之间画了一条线。stat\u summary是否可以在每个类别内画一条中间线,或者我是否需要使用不同的方法(例如计算中间值并

我已经接近绘制我想要的图了,但还没有完全弄清楚
stat\u summary
是否是显示所需图的正确方式

所需输出为散点图,每个类别内每年有一条中间线。例如,在下面的图中,我希望a类中1999年、2000年和2001年的值有一条中间线(即3条颜色线),然后B类中的值相同(总共6条中间线)

我看了看,但这似乎没有达到我想要的,因为它使用了方面

我的情节看起来像是在每个类别的中间点之间画了一条线。
stat\u summary
是否可以在每个类别内画一条中间线,或者我是否需要使用不同的方法(例如计算中间值并将每条线按类别添加到绘图中)

可复制的简单示例

library(tidyverse)
library(lubridate)

# Sample data
Date     <- sort(sample(seq(as.Date("1999-01-01"), as.Date("2002-01-01"), by = "day"), 500))
Category <- rep(c("A", "B"), 250)
Value    <- sample(100:500, 500, replace = TRUE)

# Create data frame
mydata   <- data.frame(Date, Category, Value)

# Plot by category and color by year
p <- ggplot(mydata, aes(x = Category, y = Value,
                        color = factor(year(Date))
                        )
            ) + 
  geom_jitter() 
p


# Now add median values of each year for each group
p <- p +
  stat_summary(fun.y = median,
               geom  = "line",
               aes(color = factor(year(Date))),
               group = 1,
               size = 2
               )
p
库(tidyverse)
图书馆(lubridate)
#样本数据

Date您要查找的实际上是一个点,即使它看起来像一条线,因为您不想连接观测值(线的作用),您只想显示离散值(点的作用)

一种方法,非常类似于你链接的帖子,就是做你的
stat_摘要
,并使用一个基本上是大破折号的形状。我调低了抖动点的alpha和大小,以便更好地将它们与中间点区分开来。对于中间点,我保持颜色分配不变,但将组设置为year和c之间的交互类别,因此将计算六个不同的中间值

请注意,我为随机数生成设定了一个种子,并将结束日期改为2001年12月31日,而不是2002年1月1日,因为您说您预期3年,但在一代中,我得到了一些2002年1月1日的观察结果

库(tidyverse)
图书馆(lubridate)
种子(987)

日期这里有另一种可能使用
geom\u errorbar
(而不是
stat\u summary


它没有第一个解决方案那么干净(因为您需要在
geom\u errorbar
中指定所有美学)但是结果是一样的。

我很困惑:你在x轴上有
类别
。你不希望这些线从一个
类别
连接到下一个类别吗?如果你想要每组中的线,它们会连接什么?或者你真的只想在这6个中间点中的每一个点上有一个点,或者一条水平线表示t中位数?这些线将显示每个类别的年中位数,这样可以看到它们在类别内的比较位置以及与其他类别的比较位置,但在这种情况下,实际将类别间的线与真实数据集连接起来是没有意义的。因此,更像是您链接到的帖子,而不是传统的折线图de>geom_line
的默认用途更多的是连接观察结果,但你想要的是点,但…线型?非常有用的Camille。不完全是我想要的,但非常接近且非常聪明。它似乎不适用于geom=“boxplot”出于某些原因。@SimonWoodward箱线图需要指定的内容比点更复杂。您应该会收到错误消息
geom\u箱线图需要以下缺失的美学:下部、上部、中部
我在这里解决了我的问题,非常感谢。我试图通过分层geom\u h来做类似的事情在一个单独的数据框中按年计算中间值后,行(并且在分层方面存在一些问题),但这非常有效。毛里塔尼亚,如果我可以问一个后续问题:如果我按照mymedians%group_by(Category,factor(year(Date))%单独计算中间值%>%Summary(median_by_year=median(Value))有没有办法将此数据框中的中线分层到原始绘图上?你的答案很好,我只是想知道是否有其他方法可以将相同的信息分层。@DaveM我更新了我的帖子,以给出一个示例来回应你的评论。请看一看。
# Sample data
set.seed(2017);
Date     <- sort(sample(seq(as.Date("1999-01-01"), as.Date("2002-01-01"), by = "day"), 500))
Category <- rep(c("A", "B"), 250)
Value    <- sample(100:500, 500, replace = TRUE)
mydata   <- data.frame(Date, Category, Value)

mydata %>%
    mutate(colour = factor(year(Date))) %>%
    group_by(Category, year(Date)) %>%
    mutate(Median = median(Value)) %>%
    ggplot(aes(Category, Value, colour = colour)) +
    geom_jitter() +
    geom_errorbar(
        aes(ymin = Median, ymax = Median))
df <- mydata %>%
    mutate(Year = as.factor(year(Date))) %>%
    group_by(Category, Year) %>%
    summarise(Median = median(Value))

ggplot(mydata, aes(Category, Value, colour = factor(year(Date)))) +
    geom_jitter() +
    geom_errorbar(
        data = df,
        aes(x = Category, y = Median, colour = Year, ymin = Median, ymax = Median))