不确定这是不是编程问题...
如果我有下面的数据,它产生了一个“尖峰”图表,我想用ggplot2产生一个稍微平滑的图表,我如何才能最优雅地去做它。通常的平滑方法删除了太多的信息。我正在考虑的一种方法是在当前集合之间插入额外的两个数据点,然后取两个周期的移动平均值或其他什么。手动编写代码似乎有很多困难的工作,所以我将采取一个优雅地自动化的答案作为最后的手段。
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) 谢谢
发布于 2013-05-28 18:28:03
你可以尝试一个多项式。由于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-28 18:35:34
如果你想避免从数据中丢失太多的信息,下面可能是一个更好的方法,它适用于大型数据集:
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)

https://stackoverflow.com/questions/16789502
复制相似问题