2017-08-12 16 views
0

ggplot2パッケージ(既に累積データ)でバープロットにプロットされるいくつかの値を含むデータの表があります。R ggplot2と結合された棒グラフ:ドッジと積み重ね

period,amount,a1,a2,b1,b2,h1,h2,h3,h4 
J,18.1,30,60,40,60,15,50,30,5 
K,29,65,35,75,25,5,50,40,5 
P,13.3,94,6,85,15,10,55,20,15 
N,21.6,95,5,80,20,10,55,20,15 

最初の列(期間)は地質時代である:

データフレーム「埋蔵量」のデータは(簡体字)形状を有しています。これは、x軸になり、私はそれに余分な秩序を持たないために必要なので、私は、コマンド

reserves$period <- factor(reserves$period, levels = reserves$period) 
で適切な因子ラベルを用意し

コラム「量」とは、y軸としてプロットするメインカラム(ありますそれは各時代の炭化水素のパーセンテージですが、何百万トンもの絶対値もあります。したがって、基本的なプロットは次のコマンドによって呼び出されます:

ggplot(reserves,aes(x=period,y=amount)) + geom_bar(stat="identity") 

しかし、ここに質問があります。同じ棒グラフに他の値a1-a2、b1-b2、h1-h4をプロットする必要があります。これらの値は、各文字のパーセント値です(例:a1 = 60、a2 = 40、b1-b2と同じ、h1-h4の場合も100になります)。したがって、値はa1- a2をxの各値(積み重ねられた棒グラフ)に比例して分割する色として、b1-b2の値に同じ値を必要とするので、各期間に2つの隣接する列(グループ化された棒グラフ)次に、値h1〜h4の3番目の列が積み重ねられた棒グラフとしても、3番目の列として、または1番目の列の上にずらされたバープロットとして必要です。

したがって、レイアウト私は

layout of a combined barplot

:次のようになります最初にパッケージreshape2でデータを再作成し、geom_bar()でposition = "dodge"またはposition = "fill"というオプションを使用する必要があることを知りましたが、ここではその組み合わせです。そして3番目の棒グラフ(値h1〜h4の場合)は固定高さの "積み重ねられたパーセント"表示を必要とするようです。

プロットするデータをより直感的に扱うパッケージはありますか?私たちは変数ai、bi、hiをプロットしたいと宣言しています。

答えて

1

まず、データをワイドからロングまで再構成し、比率を生の値にスケールする必要があります。次に、古い列の名前(現在は "lett"のレベル)を文字と数字に分割してラベリングします。実際のデータがこのようにフォーマットされていない場合(a1 ... h4)、それを処理する方法もあります。その後

library(dplyr) 
library(tidyr) 
library(ggplot2) 

reserves <- read.csv(text = "period,amount,a1,a2,b1,b2,h1,h2,h3,h4 
J,18.1,30,60,40,60,15,50,30,5 
K,29,65,35,75,25,5,50,40,5 
P,13.3,94,6,85,15,10,55,20,15 
N,21.6,95,5,80,20,10,55,20,15") 

reserves.tidied <- reserves %>% 
    gather(key = lett, value = prop, -period, -amount) %>% 
    mutate(rawvalue = prop * amount/100, 
     lett1 = substr(lett, 1, 1), 
     num = substr(lett, 2, 2)) 

reserves.tidied 
period amount lett prop rawvalue lett1 num 
1  J 18.1 a1 30 5.430  a 1 
2  K 29.0 a1 65 18.850  a 1 
3  P 13.3 a1 94 12.502  a 1 
4  N 21.6 a1 95 20.520  a 1 
5  J 18.1 a2 60 10.860  a 2 
6  K 29.0 a2 35 10.150  a 2 
7  P 13.3 a2 6 0.798  a 2 
8  N 21.6 a2 5 1.080  a 2 
9  J 18.1 b1 40 7.240  b 1 
10  K 29.0 b1 75 21.750  b 1 
11  P 13.3 b1 85 11.305  b 1 
12  N 21.6 b1 80 17.280  b 1 
13  J 18.1 b2 60 10.860  b 2 
14  K 29.0 b2 25 7.250  b 2 
15  P 13.3 b2 15 1.995  b 2 
16  N 21.6 b2 20 4.320  b 2 
17  J 18.1 h1 15 2.715  h 1 
18  K 29.0 h1 5 1.450  h 1 
19  P 13.3 h1 10 1.330  h 1 
20  N 21.6 h1 10 2.160  h 1 
21  J 18.1 h2 50 9.050  h 2 
22  K 29.0 h2 50 14.500  h 2 
23  P 13.3 h2 55 7.315  h 2 
24  N 21.6 h2 55 11.880  h 2 
25  J 18.1 h3 30 5.430  h 3 
26  K 29.0 h3 40 11.600  h 3 
27  P 13.3 h3 20 2.660  h 3 
28  N 21.6 h3 20 4.320  h 3 
29  J 18.1 h4 5 0.905  h 4 
30  K 29.0 h4 5 1.450  h 4 
31  P 13.3 h4 15 1.995  h 4 
32  N 21.6 h4 15 3.240  h 4 

あなたの片付けデータをプロットするには、x軸間の手紙、そして私たちはy軸上の量*の割合で計算rawvalueをしたいです。我々はgeom_colを1から2または1から4まで積み重ねます(reverse=T引数はデフォルトを上書きし、スタックの最下位に2または4を指定します)。 alphafillは、同じバーとバーのグループを区別します。

次に、geom_textは、名前、改行、および元のパーセンテージを各セグメントの中央に付けて、各スタックセグメントにラベルを付けます。 scaleはデフォルトの動作を再び元に戻し、1が最も暗く、2または4が各バーで最も明るくなります。次に、facetを横切って、各期間に1つのグループのバーを作成します。「H」のバーが「A」と「B」のバーは異なっているように、それを整理する

ggplot(reserves.tidied, 
     aes(x = lett1, y = rawvalue, alpha = num, fill = lett1)) + 
    geom_col(position = position_stack(reverse = T), colour = "black") + 
    geom_text(position = position_stack(reverse = T, vjust = .5), 
       aes(label = paste0(lett, ":\n", prop, "%")), alpha = 1) + 
    scale_alpha_discrete(range = c(1, .1)) + 
    facet_grid(~period) + 
    guides(fill = F, alpha = F) 

enter image description here

少し複雑で、あなたが望む方法を考える必要があるだろうそれは提示されましたが、それは完全に実行可能です。

+0

プログラミングの面白い@Brianです。私は今、同じスマートな方法で凡例(ガイド)を組み合わせる方法はありますか? '+ガイド(fill ="凡例 "、アルファ="凡例 ")' をデフォルトとして追加し、1つは塗りつぶし、もう1つはアルファグラデーション(lett1とnum変数このコードで)。しかし、もしこれらのバーを一緒にして対応させたいのであれば?すなわち、a1-a2(赤ピンク、書き込みはa1が砕け、a2は炭酸塩)、2-nd:b1-b2(緑 - 薄緑)、最後のh1-h4ライトブルーに)、プロットのように? – astrsk

関連する問題