2017-08-12 115 views
0

我有一個數據表,其中已經包含幾個值要繪製在帶有ggplot2軟件包(已累積數據)的barplot上。與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的每個值(堆疊barplot)按比例劃分「量」欄,那麼我需要b1-b2的值相同;因此我們需要爲每個時期兩個相鄰的列(分組的條形圖),每個列然後,我需要第三列,值爲h1-h4,或許也是一個堆疊的barplot,但不管是作爲第三列,還是作爲第一列以上的交錯barplot

所以佈局看起來是這樣的:

layout of a combined barplot

我瞭解到我需要首先使用package reshape2重塑數據,然後在geom_bar()中使用選項position =「dodge」或position =「fill」,但這裏是其組合。第三個barplot(對於值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軸的信件,和rawvalue我們只是量計算* y軸上的比例。我們將geom_col從1增加到2或1到4(參數reverse=T覆蓋默認值,在堆棧底部有2或4)。 alphafill讓我們區分同一條和條之間的組。

然後geom_text以每個段爲中心標記每個堆疊段的名稱,換行符和原始百分比。 scale再次反轉默認行爲,使每個欄中最暗的1和最亮2或4。然後你跨越,爲每個時期製作一組酒吧。

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

重新安排它,這樣的「H」酒吧,從「A」和「B」的酒吧不同的是更爲複雜一點,你要想想你想怎麼它提出了,但它是完全可行的。

+0

這是編程的絕佳解決方案,@Brian。我想知道現在有沒有辦法以同樣的智能方式來組合傳奇(指南)? 即我添加 '+指南(fill =「legend」,alpha =「legend」)' 作爲默認開始,並獲得兩個圖例欄,一個用於填充,另一個用於alpha等級(lett1和num變量在這個代碼中)。但是,如果我們想要將這些酒吧橫跨變量並進行合併_相應地_split_,也就是說:有一個條a1-a2(紅粉紅色;然後寫a1代表碎屑,a2代表碳酸鹽),2-b1-b2(綠 - 淺綠)和最後一個h1-h4(藍淡藍色),就像情節一樣? – astrsk