3

これがプログラミングの質問かどうかはわかりません...

「とがった」グラフを生成する以下のデータがあり、ggplot2 を使用して少し滑らかなグラフを生成したい場合、どのようにすれば最もエレガントに処理できますか。通常の平滑化方法では、あまりにも多くの情報が削除されます。私が検討している 1 つの方法は、現在のセットの間に余分な 2 つのデータ ポイントを補間してから、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"は、線形モデルが使用されることを意味します。関数の 2 番目の引数は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 に答える