ggplot2 geom_area覆盖区域在彼此前面绘制

时间:2016-11-09 20:36:36

标签: r ggplot2

我试图制作一个区域图,其中不同的区域彼此重叠而不是堆叠。

我有一个如下所示的数据框:

     r   variable      value
1  45.0    Cat 1   4.057250e+03
2  52.5    Cat 1   3.537323e+03
3  56.1    Cat 1   3.429861e+03
4  57.3    Cat 1   3.395330e+03
5  57.6    Cat 1   3.389983e+03
6  45.0    Cat 2   4.545455e-03
7  52.5    Cat 2   4.509400e+01
8  56.1    Cat 2   3.525753e+02
9  57.3    Cat 2   4.185094e+02
10 57.6    Cat 2   4.336622e+02
11 45.0    Cat 3   4.074432e+03
12 52.5    Cat 3   3.630504e+03
13 56.1    Cat 3   3.919076e+03
14 57.3    Cat 3   3.957039e+03
15 57.6    Cat 3   3.970083e+03
16 45.0    Cat 4   1.718182e+01
17 52.5    Cat 4   9.318133e+01
18 56.1    Cat 4   4.892154e+02
19 57.3    Cat 4   5.617087e+02
20 57.6    Cat 4   5.801001e+02

我正在尝试获取每个类别的区域图。我的代码是:

p <- ggplot(reshaped_data, aes(r, value))
p <- p + labs(x = "X Axis", y = "Y Axis") + ggtitle(title)  
p <- p + geom_area(aes(colour = variable, fill= variable), position = 'stack')   
p

我得到的结果看起来像这样: Generated Graph

我怎样才能使区域图形不会相互堆叠,但最小的图形会覆盖在较大的区域图形之前?

由于

2 个答案:

答案 0 :(得分:1)

正如内森所写,你必须使用geom_area(position = "identity", ...)

但在此之前你应该重新排序变量的级别:

df$variable <- factor(df$variable, unique(df[order(df$value, decreasing = T),"variable"]) )

df$variable <- reorder(df$variable, df$value, function(x) -max(x) )

答案 1 :(得分:1)

使用tidyverse

library(forcats)
p + geom_area(aes(colour = variable, 
fill= fct_reorder(variable, value, .desc = TRUE)), position = 'identity') 

如果它与你想要的相反,请删除.desc = TRUE