2017-02-02 2 views
1

私は40グループ(short_IDで定義されています)を持ち、それぞれのshort_IDに対して異なるyスケールのブレークを使用する40の異なるプロットを生成したいと考えています。私はyスケールのための休憩を(1)mean-2SD、(2)平均および(3)mean + 2SDにしたい。R ggplot:ファセットされたggplotsを使用してグループ依存のy軸ブレークを定義するにはどうすればよいですか?

私はXとY変数とグループ化変数 "short_ID"を含むDataplotsというデータセットを持っています。ブレークとM $ short_IDをグループ化変数として定義するために、追加のベクトルM $ SD11(= mean-2SD)、M $ meanとM $ SD22(= mean + 2SD)を作成しました。以下のコードは部分的には動作しますが、問題は私がブレークをグループに依存する(つまり、short_IDに依存する)方法を知らないということです。下のコードを実行すると、すべてのプロットに対して同じy軸ブレークが得られます。たとえば、各プロットのM $ SD22値ではなく、ベクトルM $ SD22の最大値です。だから、私は

"scale_y_continuous(breaks=c(M$SD11, M$mean, M$SD22)", for example "scale_y_continuous(group=M$short_ID, breaks=c(M$SD11, M$mean, M$SD22)" but this does not work.   

に何かを追加する必要があると思う誰もが、私は私の異なるグループ(すなわち、short_IDs)のための異なるブレークを定義するために何ができるか知っていますか?これを行うには、以下のコードをどのように変更できますか?どうもありがとう!

Dataplot <- ggplot(data = Dataplots, aes(x = Measure, y = Amylase_u, group = short_ID)) + geom_line() + facet_wrap(~ short_ID) + scale_y_continuous(breaks=c(M$SD11, M$mean, M$SD22)) 

「データプロット」と「M」の例を追加しました。この例の目的のために、私は実際に持っている40の代わりに2つのグループ(すなわち、short_ID)のみを含めた。したがって、この例では、2つのプロットを生成する必要があります。各プロットは、各short_IDに対して1つずつあり、グループごとに異なるy軸区切りを使用します。 Dataplotsの

例:Mの

dput(Dataplots) structure(list(short_ID = c(1111, 1111, 1111, 1111, 2222, 2222, 2222, 2222), Measure = c(1, 2, 3, 4, 1, 2, 3, 4), Amylase_u = c(81.561, 75.648, 145.25, 85.246, 311.69, 261.74, 600.93, 291.39)), .Names = c("short_ID", "Measure", "Amylase_u"), row.names = c(NA, -8L), class = "data.frame", codepage = 65001L) 

例:

dput(M) structure(list(SD11 = c(162, 682), mean = c(97, 366), SD22 = c(32, 51), short_ID = c(1111, 2222)), .Names = c("SD11", "mean", "SD22", "short_ID"), row.names = 1:2, class = "data.frame") 

@マーク、私は完全なデータセットにあなたの提案を適用しようとしているが、右のそれを得るように見えることはできません。私は合計61のプロットを持っています。

myPlots <- 
lapply(unique(Dataplots$short_ID), function(thisID){ 
Dataplots %>% 
    filter(short_ID == thisID) %>% 
    ggplot(aes(x = Measure, y = Amylase_u)) + 
    geom_line() + 
    scale_y_continuous(breaks= M %>% 
         filter(short_ID == thisID) %>% 
         select(mean) %>% 
         as.numeric() 
) + 
    ggtitle(thisID) 
}) 

私は、あなたの最終cowplotの暗示を続け(あなたが見ることができるように私は、y軸上の被験者の平均のために行くことにしましたし、SDSをドロップすることを決めた。)::私は始め

plot_grid(ggdraw() + draw_label("Amylase_u", angle = 90), plot_grid(
plot_grid(plotlist = lapply(myPlots, function(x){x + theme(axis.title = element_blank())})) 
, ggdraw() + draw_label("Measurement") 
, ncol = 1 
, rel_heights = c(0.9, .1)) 
, nrow = 1, rel_widths = c(0.05, 0.95)) 

しかし、このことは、y軸上の被験者平均を有する61のプロットをもたらすが、その中には測定が指定されていない(グラフ自体が欠落している)。

plot_grid(
ggdraw() + draw_label("Amylase_u", angle = 90) 
, plot_grid(
plot_grid(plotlist = lapply(myPlots, function(x){x +theme(axis.title = element_blank())})) 
, ggdraw() + draw_label("Measurement") 
, ncol = 1 
, rel_heights = c(0.9, .1) 
, nrow = 1 
, rel_widths = c(0.05, 0.95))) 

これは私のグラフを与えるんが、彼らは小さなであり、レイアウトが)Rplot2(ひどいです:私は、私が試した置き忘れ「)」があるかもしれない考え出しました。 rel-heightとwidthを適応させようとしましたが、ヘルプファイルを読んだ後でも、どのようにそれらを適応させるべきかは分かりません。

もう一度おねがいします!彼らは本当に必要はありません、これはすでに大幅にプロット(Rplot3)を向上させ、それでもレイアウトを調整する必要があるため

Rplot2

最後に、私は、各プロットの上にIDnumbersを削除しました。

Rplot3

+0

こんにちはを与えます。あなたが最小限の再現可能な例を提供すれば、多くの助けになります。 'dput()'を使ってこのプロセスを手助けすることができます:https://gist.github.com/dsparks/3688652 – Docconcoct

+0

この提案をありがとう。私は今再現可能な例を追加しました。私はあなたに私にいくつかの助言を与えることができれば嬉しいです事前に多くの感謝! – Charlotte

答えて

1

私の理解では、これはまだfacet機能では不可能残っていることです。しかし、あなたはcowplotパッケージを使って自分でそれを達成することができます。

まず、あなたのアイデア(lapply)をループして、それぞれのサブプロットを生成します。パイプとフィルタリングにはdplyrを使用しています。

myPlots <- 
    lapply(unique(Dataplots$short_ID), function(thisID){ 
    Dataplots %>% 
     filter(short_ID == thisID) %>% 
     ggplot(aes(x = Measure, y = Amylase_u)) + 
     geom_line() + 
     scale_y_continuous(breaks= M %>% 
          filter(short_ID == thisID) %>% 
          select(SD11, mean, SD22) %>% 
          as.numeric() 
         ) + 
     ggtitle(thisID) 
    }) 

次に、プロットのリストをcowplotから機能を呼び出すplot_grid

plot_grid(plotlist = myPlots) 

することはできます:

enter image description here

いくつかの注意事項:

  • cowplotは、独自のデフォルトのスタイルをオートロードするので、
  • ご含まれるデータは、実際にこれは、任意の大きさのために働く必要がありますが、y軸のために与えたしきい値のすべてにまたがる
  • 壊していないように見えるあなたの好みのスタイルに戻ることtheme_setを使用しますサブプロットの数ですが、ラベルやアライメントを調整して読みやすくする必要があります。

私はあなたの目標が何であるか分からないので、ここに別の選択肢があります。比較を可能にするために平均からの偏差(標準偏差)をプロットしたいのであれば、グループ内のカラムのzスコアを計算し、結果をプロットすることができます。再びdplyrの使用:

Dataplots %>% 
    group_by(short_ID) %>% 
    mutate(scaledAmylase = as.numeric(scale(Amylase_u))) %>% 
    ggplot(aes(x = Measure 
      , y = scaledAmylase)) + 
    geom_line() + 
    facet_wrap(~short_ID) 

enter image description here

あるいは、平均値/ SDをすることができます、/計算どこかに定義された(とMに格納されている)のではなくデータから直接来ている場合を与えます代わりに、データのMを使用して、スケール:

Dataplots %>% 
    left_join(M) %>% 
    mutate(scaledAmylase = (Amylase_u - mean)/((SD22 - mean)/2)) %>% 
    ggplot(aes(x = Measure 
      , y = scaledAmylase)) + 
    geom_line() + 
    facet_wrap(~short_ID) 

0123を与えます

enter image description here

そして、私は一人で十分に離れることができないので、ここでは重複軸タイトルを削除し、代わりに一度だけ(のようfacet_wrapだろう)、それらを含んplot_gridアプローチのバージョンがあります。上記のように、サブプロットの数やアスペクト比を大きくすると、ここで相対値を微調整するためにあなたを強制します:

plot_grid(
    ggdraw() + draw_label("Amylase_u", angle = 90) 
    , plot_grid(
    plot_grid(plotlist = lapply(myPlots, function(x){x + theme(axis.title = element_blank())})) 
    , ggdraw() + draw_label("Measurement") 
    , ncol = 1 
    , rel_heights = c(0.9, .1)) 
    , nrow = 1 
    , rel_widths = c(0.05, 0.95) 
) 

enter image description here

+0

この返信に感謝します!これは非常に便利です。 – Charlotte

+0

@Charlotteあなたの質問に答えますか? –

+0

私は離れましたが、私の完全なデータファイルにあなたの提案を適用しようとしました。しかし、私はまだいくつかの問題に遭遇しています。上記の問題の詳細な説明を追加しました(@Markのすべてをご覧ください)。もう1つ質問があります:欠落値が含まれているため、1行が削除されたというメッセージが表示されます。それは4つの値のうちの1つを欠いているので、この行をプロットし、完全な行ではなく1つの欠損値を除外することは可能でしょうか?ありがとう! – Charlotte

関連する問題