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))