3

不确定这是否是一个编程问题......

如果我有下面的数据,它会生成一个“尖峰”图表,并且我想使用 ggplot2 生成一个稍微平滑的图表,我该如何最优雅地进行处理。通常的平滑方法会删除太多信息。我正在考虑的一种方法是在当前集合之间插入额外的两个数据点,然后采用 2 周期移动平均线或其他方法。手动编码似乎是一项艰巨的工作,所以我将采取一个优雅地自动化的答案作为最后的手段。

a=data.frame(year=paste('FY',2001:2012,sep='.'),values=rnorm(12))
library(ggplot2)

正如你所看到的,这是尖尖的,视觉上没有吸引力

ggplot(a,aes(x=year,y=values,group=1))+geom_line() 

这从图表中删除了太多信息

ggplot(a,aes(x=year,y=values,group=1))+stat_smooth(se=F) 

谢谢

4

2 回答 2

9

您可以尝试多项式。由于 x 轴变量有 12 个唯一值,因此您可以使用最高 11 次的多项式。此外,您应该对 x 轴使用连续刻度以实现平滑曲线。

这是一个 8 阶多项式的示例:

ggplot(a, aes(x = year, y = values, group = 1))+
  stat_smooth(aes(x = seq(length(unique(year)))), # continuous x-axis
              se = F, method = "lm", formula = y ~ poly(x, 8)) +
  scale_x_continuous(breaks = seq(length(unique(a$year))), 
                     labels = levels(a$year)) # original labels

这里,method = "lm"表示使用线性模型。函数的第二个参数poly指定度数。 在此处输入图像描述

于 2013-05-28T10:28:02.770 回答
6

如果您想避免从数据中丢失太多信息,下面可能是一种更好的方法,它适用于大型数据集:

library(zoo)
library(reshape)
a$smooth<-rollmean(a$values,3,fill="extend") # 2nd parameter defines smoothness 
ggplot(melt(a),aes(x=year,y=value,color=variable,group=variable))+geom_line()

在此处输入图像描述

这是一个更好的例子:

a <- data.frame(year=1:10,values=sin(1:10)+runif(10))
a$smooth<-rollmean(a$values,3,fill="extend")
ggplot(melt(a,id.vars="year"),aes(x=year,y=value,color=variable,
      group=variable))+geom_line(size=2)

在此处输入图像描述

于 2013-05-28T10:35:33.730 回答