2017-08-12 136 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