21

ggplot で position_dodge を使用して、同じカテゴリ (cat) を共有する 2 つの異なる信号 (ind) の箱ひげ図を取得しようとしています。ある信号のデータを含むカテゴリがあり、他の信号のカテゴリがない場合、データを含む信号の箱ひげ図はすべての水平間隔をカバーし、その特定のカテゴリの position_dodge 命令を尊重しません。回避ルールを適用するために ggplot を作成する方法はありますか? 以下の例でわかるように、信号 x にはカテゴリ B のデータがないため、position_dodge によって予約されたスペースが失われます。それは避けたいと思います。

前もって感謝します。

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), 
                 values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), 
                 ind=c('x','x','x','x','x','x','y','y','y','y','y','y'))

print(ggplot() +
        scale_colour_hue(guide='none') +
      geom_boxplot(
           aes(x=as.factor(cat), y=values, 
               fill=ind), 
           position=position_dodge(width=.60), 
           data=data,
           outlier.size = 1.2,
           na.rm=T))

元の問題のあるグラフ

進行状況の更新

いくつかの回避策の後、探していた結果にたどり着きました...(ちょっと)

data            <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), 
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x'))

p  <- ggplot() +
      scale_colour_hue(guide='none') +
      geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind),
      position=position_dodge(width=.60), 
      data=data,
      outlier.size = 1.2,
      na.rm=T) +
      geom_line(aes(x=x, y=y), 
                data=data.frame(x=c(0,3),y=rep(0,2)), 
                size = 1, 
                col='white')
print(p)

回避策のあるソリューション

私が望む効果のためにファセットを使用することを推奨する人もいました。ファセットでは、探している効果が得られません。私が探していた最終的なグラフを以下に示します。

最終グラフ

お気付きのように、y = 10 の白い主目盛りは、他の目盛りよりも太くなっています。この太い線は、不要な箱ひげ図を隠す size=1 の geom_line です。

異なる geom オブジェクトをもっとシームレスに組み合わせることができればいいのにと思います。私はこれを Hadley の github のバグとして報告しましたが、Hadley は、これが position_dodge の仕様による動作であると述べました。私は ggplot2 を非標準的な方法で使用していると思います。回避策は、この種の問題を解決する方法です。とにかく、これが R の人々の何人かが ggplot の優れた機能をもう少しプッシュするのに役立つことを願っています.

4

3 に答える 3

3

いくつかの回避策の後、私は探していた結果を思いつきました...(種類)

data            <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), 
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x'))

p  <- ggplot() +
      scale_colour_hue(guide='none') +
      geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind),
      position=position_dodge(width=.60), 
      data=data,
      outlier.size = 1.2,
      na.rm=T) +
      geom_line(aes(x=x, y=y), 
                data=data.frame(x=c(0,3),y=rep(0,2)), 
                size = 1, 
                col='white')
print(p)

回避策のあるソリューション

何人かの人々は私が望む効果のためにファセットを使うことを勧めました。ファセットは私が探している効果を私に与えません。私が探していた最終的なグラフを以下に示します。

最終グラフ

お気づきの方もいらっしゃると思いますが、y=10の白い主目盛りは他の目盛りよりも太いです。この太い線は、不要な箱ひげ図を非表示にするsize=1のgeom_lineです。

異なるgeomオブジェクトをよりシームレスに組み合わせることができればと思います。これをHadleyのgithubのバグとして報告しましたが、Hadleyは、これがposition_dodgeの設計上の動作であると述べました。私はggplot2を非標準的な方法で使用していると思います。回避策は、この種の問題を解決する方法です。とにかく、これが一部のRの人々がggplotの優れた機能をもう少しプッシュするのに役立つことを願っています。

于 2012-10-15T13:43:00.427 に答える
2

Hadley が彼の gitサイトに投稿したコメントの 1 つからファセットを使用する手がかりを得たので、クレジットは ggplot2 パッケージのメンテナーである Hadley に送られます!

これがあなたが望んでいたものかどうかを確認してください。このプロットでウィスカーなどを設定するオプションの詳細については、ggplot2 パッケージのこのヘルプ ページを確認してください。

?stat_boxplot

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), 
             values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), 
             ind=c('x','x','x','x','x','x','y','y','y','y','y','y'))

p <- ggplot(data = data, aes(factor(cat), values))                     
p + stat_boxplot(geom="boxplot", position = "dodge", width = 0.60, na.rm = TRUE) +  facet_grid(.~ind)

ここに画像の説明を入力

プロットに色を追加するには、私の意見では、「ind」変数に基づいてプロットをすでに面付けしているため、冗長なものです。これを試してください。

p <- ggplot(data, aes(factor(cat), values, fill = ind))                     
p + stat_boxplot(geom="boxplot", position = "dodge", width = 0.60, na.rm = TRUE) + facet_grid(.~ind)

ここに画像の説明を入力

チッ!

于 2012-10-12T23:50:28.353 に答える
2

B の x には値がないため、「B」、0、「x」を追加できます。これは、基本的に、B の x に「値」の分布がないことを示します。中央値とその他のパーセンタイルはゼロです。

 data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
             values=c(3,2,1,4,NA,NA,4,5,6,7,8,9,0), 
             ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x'))

また、ここで位置パラメーターを追加する必要はありません。x を係数と見なすと、ggplot -- geom_boxplot が自動的に側面をかわすからです。

print(ggplot() +
  scale_colour_hue(guide='none') +
  geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
  data=data,
  outlier.size = 1.2,
  na.rm=T))

于 2012-10-10T06:02:05.277 に答える