R ggplot2对只有几个数据点的线图引入轻微的平滑
不确定这是否是一个编程问题 如果我有下面的数据,它会生成一个“尖形”图表,我想使用ggplot2生成一个稍微平滑的图表,我该如何最优雅地处理它。通常的平滑方法删除了太多的信息。我正在考虑的一种方法是在当前集合之间插入额外的两个数据点,然后取一个2周期移动平均值或其他什么。手动编写代码似乎是一项艰巨的工作,所以我将采用一个能够优雅地自动完成这项工作的答案作为最后的手段R ggplot2对只有几个数据点的线图引入轻微的平滑,r,ggplot2,R,Ggplot2,不确定这是否是一个编程问题 如果我有下面的数据,它会生成一个“尖形”图表,我想使用ggplot2生成一个稍微平滑的图表,我该如何最优雅地处理它。通常的平滑方法删除了太多的信息。我正在考虑的一种方法是在当前集合之间插入额外的两个数据点,然后取一个2周期移动平均值或其他什么。手动编写代码似乎是一项艰巨的工作,所以我将采用一个能够优雅地自动完成这项工作的答案作为最后的手段 a=data.frame(year=paste('FY',2001:2012,sep='.'),values=rnorm(12))
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)
谢谢你可以试试多项式。由于x轴变量有12个唯一值,因此可以使用高达11次的多项式。此外,您应该为x轴使用连续缩放以实现平滑曲线 下面是一个八阶多项式的示例:
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
函数的第二个参数指定度。
如果您希望避免从数据中丢失过多的信息,下面可能是一个更好的方法,适用于大型数据集:
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()
图书馆(动物园)
图书馆(重塑)
一个适用于单个图形的$smooththanks@SvenHohenstein。我正在努力使多个数据集水平对齐,并扩展x轴,因此我需要稍微回到绘图板上。@SvenHohenstein这是一个非常好的方法。在我的例子中,我想做同样的事情,但是我的多项式不能给出负值。是否有可能对stat_smooth设定一个下限?Thanks@pacomet您不能在stat\u smooth
中指定限制。您应该为您的数据搜索一个特定的平滑函数,该函数可用于stat\u smooth
@SvenHohenstein您是否建议从scale\u x\u date
切换到scale\u continuous
,以便在出现月度值时使线条更平滑?@Talik3233这取决于您的偏好。当数据合适时,经典的连续刻度没有问题。
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)