问题描述
我正在尝试使用ggplot在单个折线图上绘制多个时间序列变量。我正在使用一个包含n个时间序列变量和一列时间段的data.frame。本质上,我想遍历data.frame,并在单个图表中恰好添加n条goem_lines。
最初,我尝试使用以下代码,其中;
- df =包含n个时间序列变量和1列时间段的data.frame
- wid = n(时间序列变量的数量)
p <- ggplot() + scale_color_manual(values=c(colours[1:wid])) for (i in 1:wid) { p <- p + geom_line(aes(x=df$Time,y=df[,i],color=var.lab[i])) } ggplotly(p)
但是,这只会在data.frame中生成最终时间序列变量的图。然后,我进一步调查,发现以下代码集产生了完全不同的结果:
p <- ggplot() + scale_color_manual(values=c(colours[1:wid])) i = 1 p = p + geom_line(aes(x=df$Time,color=var.lab[i])) i = 2 p = p + geom_line(aes(x=df$Time,color=var.lab[i])) i = 3 p = p + geom_line(aes(x=df$Time,color=var.lab[i])) ggplotly(p)
p <- ggplot() + scale_color_manual(values=c(colours[1:wid])) p = p + geom_line(aes(x=df$Time,1],color=var.lab[1])) p = p + geom_line(aes(x=df$Time,2],color=var.lab[2])) p = p + geom_line(aes(x=df$Time,3],color=var.lab[3])) ggplotly(p)
在我看来,这两套代码是相同的,所以谁能解释为什么它们产生如此不同的结果?
我知道使用自动绘图可以很容易地做到这一点,但是我对这两个代码片段的行为更感兴趣。
解决方法
您试图做的是通过绘制多条线的“ hack”方式,但这在ggplot术语中并不理想。要成功完成此操作,我将使用static var previews: some View {
BackgroundView {
Text("Hello,world")
}
}
。但这是黑客。
aes_string
如何正确执行
要更正确地绘制此图,您需要先旋转数据,以便将每种美感(aes)映射到数据框中的变量。这意味着我们需要在数据帧中将一个变量设为df <- data.frame(Time = 1:20,Var1 = rnorm(20),Var2 = rnorm(20,mean = 0.5),Var3 = rnorm(20,mean = 0.8))
vars <- paste0("Var",1:3)
col_vec <- RColorBrewer::brewer.pal(3,"Accent")
library(ggplot2)
p <- ggplot(df,aes(Time))
for (i in 1:length(vars)) {
p <- p + geom_line(aes_string(y = vars[i]),color = col_vec[i],lwd = 1)
}
p + labs(y = "value")
。因此,我们color
并再次绘图:
pivot_longer