在一系列小提琴情节上绘制趋势线

时间:2017-11-02 13:30:06

标签: r ggplot2 violin-plot

我有每周收集的数据。我想有一个图表,显示一系列小提琴情节,每周一个。最重要的是,我想有一个趋势线。问题似乎是,为了将小提琴图分开,Week变量必须是一个因子,但为了绘制趋势线,Week变量必须是连续的。我如何获得两者?

Week = as.Date(c("2017-10-1", "2017-10-8", "2017-10-15"))
mydata = data.frame(Week = sample(Week, 200, T), v_1 = sample.int(5, 200, T))

p1 = ggplot(mydata, aes(x = factor(Week), y = v_1)) # create the plot stub
p1 + geom_violin()                                  # just violin plots
p1 + geom_smooth(method = "lm")                     # nothing
p1 + geom_violin() + geom_smooth()                  # just violin plots

p2 = ggplot(mydata, aes(x = Week, y = v_1))     # new plot stuf
p2 + geom_violin()                              # single violin plot, not separated by week
p2 + geom_smooth(method = "lm")                 # trend line
p2 + geom_violin() + geom_smooth(method = "lm") # trend line over single violin plot

1 个答案:

答案 0 :(得分:2)

# Generate data from 3 normal distributions with means -3, 3, and 6
set.seed(1)
n <- 200
dates <- as.Date(c("2017-10-1", "2017-10-8", "2017-10-15"))
mydata = data.frame(Week = rep(dates,each=n), v_1 = c(rnorm(n,-3),rnorm(n,3),rnorm(n,6)))

# Estimate a linear regression model: x is the group number
cf <- coef(lm(v_1~as.numeric(factor(Week)), data=mydata))

# Plot means (red dots) and the regression line (trend)
library(ggplot2)
ggplot(mydata, aes(x = factor(Week), y = v_1)) +
 geom_violin() +
 stat_summary(aes(group=1),fun.y=mean, geom="point", color="red", size=3) +
 geom_abline(slope=cf[2], intercept=cf[1], lwd=.8)

enter image description here