我想制作一个显示时间序列的图,其后是一组预测分布,每个分布都表示为小提琴图。下面的示例代码分别创建和绘制时间序列(作为线图)和两个小提琴图。
set.seed(12345)
x <- data.frame(time=1:50, dat=rnorm(50))
y1 <- rnorm(500)
y2 <- rnorm(500, sd=5)
y <- data.frame(time=as.factor(c(rep(51,500),rep(52,500))), dat=c(y1,y2))
ggplot(x, aes(x=time, y=dat)) +
geom_line()
ggplot(y, aes(x=time, y=dat)) +
geom_violin()
如何将它们组合成一个图表,并具有从时间点1到50(沿x轴)的折线图,然后分别是在时间点51和52的两个小提琴图?
答案 0 :(得分:4)
我不确定您是否可以在同一轴上绘制离散变量和连续变量。因此,您必须妥协。 Markus选择离散化x
变量,而我更喜欢使y
变量连续。请注意,我已经更改了y
的生成方式(删除了系数)。
library(ggplot2)
set.seed(12345)
x <- data.frame(time=1:50, dat=rnorm(50))
y1 <- rnorm(500)
y2 <- rnorm(500, sd=5)
y <- data.frame(time=c(rep(51, 500), rep(52, 500)), dat=c(y1,y2))
ggplot(x, aes(x = time, y = dat)) +
theme_bw() +
scale_x_continuous(limits = c(0, 52)) +
geom_line() +
geom_violin(data = y, aes(group = as.factor(time)))
答案 1 :(得分:2)
您需要将y$time
因子级别转换为integer
,添加分组变量,然后将data = ...
移动到特定的几何图形。
# Transform your factor variable to its factor levels
y$time <- as.integer(levels(y$time))[y$time]
# Plot with grouping for the violin plot (as x is not a factor anymore)
ggplot() +
geom_line(data = x, aes(x = time, y = dat)) +
geom_violin(data = y, aes(x = time, y = dat, group = time))