0

賢明なもの:geom_linerange()の使用について質問があります。添付されているのは、私の問題を説明するための実行可能な例であることを願っています。

b=c(100,110,90,100,120,130,170,150,150,120,140,150,120,90,90,100,40,50,40,40,20,60,30)
test<-data.frame(a=c(2,2,2,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,10,10,10,10),
                 b=b,c=c(b-15))

testMelt <- melt(
  test, 
  id       = c("a"), 
  measured = c("b", "c")
  )


p <- ggplot(
  aes(
    x    = factor(a), 
    y    = value,
    fill= variable
    ),      
   data  = testMelt) + 
    geom_boxplot() + 
          stat_smooth(aes(group=variable,x=factor(a),y=value,fill=factor(variable)),data=testMelt)

私の実際のデータセットははるかに大きく、箱ひげ図は少し圧倒的です。私が欲しいのは、geom_linerange()を使用して、「a」の各値で「b」と「c」のデータの範囲を表示することだと思います。

私が思いついた最高のものは次のとおりです。

p<- p+ geom_linerange(aes(as.factor(a),ymin=min(value),ymax=value,color=variable))

「c」の値は常に「b」以下であると想定できますが、範囲が小さければ、これで「カバー」されます。どういうわけかラインをジッターできますか?より良い解決策はありますか?

4

2 に答える 2

2

geom_linerange呼び出しで、追加の引数を追加しますposition=position_dodge(width=0.3)。絶対幅を調整して、垂直線間の間隔を変更できます。

ここに画像の説明を入力

于 2012-05-24T17:32:42.903 に答える
1

質問に対する私の理解は、線の範囲に組み合わせの範囲を反映させたいということですa:b:c

geom_linerange(aes(as.factor(a),ymin=min(value),ymax=value,color=variable))最小値をデータセット全体の最小値に設定します (したがって、すべての行が同じ最小値で表示されます。

いくつかの解決策。

最小値と最大値を自分で計算する

test_range <- ddply(testMelt, .(a,variable), summarize, 
                    val_min = min(value), val_max = max(value))

次に実行します

 ggplot(data  = testMelt) + 
    geom_boxplot(aes(x = factor(a), y = value, fill = variable)) + 
    stat_smooth(aes(group = variable, x = factor(a), y = value, 
                    fill = factor(variable))) +
     geom_linerange(data = test_range, aes(x = as.factor(a), ymin = val_min,
                    ymax = val_max, color = variable), 
                    position = position_dodge(width = 0.3))

または、箱ひげ図/線範囲の代わりにバイオリン プロットを使用します。

ggplot(data  = testMelt) + 
    geom_violin(aes(x = factor(a), y = value, fill = variable)) + 
    stat_smooth(aes(group = variable, x = factor(a), y = value, 
                    fill = factor(variable)))
于 2012-05-24T23:34:47.093 に答える