2013-05-28 2 views
3

Не уверен, если это программирование вопрос или нет ...R ggplot2 ввести небольшое сглаживание для линейного графика лишь несколько точек данных

Если у меня есть следующие данные, которые производит «остроконечный» диаграммы, и Я хотел бы создать слегка сглаженный, используя 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) 

Благодаря

ответ

9

Вы можете попробовать полином , Так как переменная оси 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 определяет степень. enter image description here

+0

спасибо @SvenHohenstein, который работает для единственного графика. Я изо всех сил стараюсь, чтобы он выравнивался по горизонтали для множества наборов данных и расширял ось X, поэтому мне нужно немного вернуться к чертежной доске ... –

+0

@SvenHohenstein Очень хороший подход. В моем случае я хочу сделать то же самое, но мой многочлен не может давать отрицательные значения. Можно ли установить более низкий предел для stat_smooth? Спасибо – pacomet

+0

@pacomet Вы не можете указать ограничение в 'stat_smooth'. Вы должны найти определенную функцию сглаживания для своих данных, которая может использоваться в 'stat_smooth'. –

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() 

enter image description here

Вот лучший пример:

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) 

enter image description here

Смежные вопросы