叠加ggplot条形图

时间:2018-08-16 14:37:11

标签: r ggplot2 plot

我使用ggplot,我想覆盖两个条形图。这是我的头部数据集:(数据= csv_total)

                              habitates surf_ha obs_flore obs_faune
1              Régénération de feuillus     0.4       0.0       2.4
2 Villes, villages et sites industriels     0.7       0.0      15.6
3                     Forêt de feuillus   384.8       1.1       0.0
4                   Forêt de Pin d'alep  2940.8       2.1       1.0
5                                Maquis    45.9       2.3       0.3
6                 Plantation de ligneux   306.4       2.5       1.0

这是我的2个条形图:

hist1 <- ggplot(csv_total, aes(x = habitates, y = obs_flore)) + geom_bar(stat = "identity") +
  theme(axis.text.x= element_text(angle=50, hjust = 1))

hist2 <- ggplot(csv_total, aes(x = habitates, y = obs_faune)) + geom_bar(stat = "identity") + 
  theme(axis.text.x= element_text(angle=50, hjust = 1))

X轴代表栖息地,Y轴代表观测数量(hist1的植物区系和hist2的动物群)。

因此,我想通过覆盖两者来创建单个条形图。为了在X轴上获得栖息地,在Y轴上获得两种不同颜色的植物学观察和植物学观察。 您是否有想法将这些条形图叠加在一起?

抱歉我的英语不好。 谢谢!

1 个答案:

答案 0 :(得分:1)

我必须为您选择,但是我更喜欢第二个(尽管可能会更长一些)。

library(ggplot2)

ggplot(csv_total) +
  geom_col(aes(x = habitates, y = obs_flore, fill = "obs_flore"), alpha = 0.5) +
  geom_col(aes(x = habitates, y = obs_faune, fill = "obs_faune"), alpha = 0.5) +
  theme(axis.text.x = element_text(angle = 50, hjust = 1))

enter image description here

这看起来不错,但是通过下面的操作,我们不必像上面那样人为地创建填充图例,我们可以使用选项“躲避”来并列显示各个列。 首先,我们必须将数据转换为长格式(使用gather中的tidyr):

library(tidyr)

csv_total_long <- gather(csv_total, flore_faune, obs, obs_flore, obs_faune)

csv_total_long
# A tibble: 12 x 4
#    habitates surf_ha flore_faune   obs
#    <chr>       <dbl> <chr>       <dbl>
# 1  A             0.4 obs_flore     0  
# 2  B             0.7 obs_flore     0  
# 3  C           385.  obs_flore     1.1
# 4  D          2941.  obs_flore     2.1
# 5  E            45.9 obs_flore     2.3
# 6  F           306.  obs_flore     2.5
# 7  A             0.4 obs_faune     2.4
# 8  B             0.7 obs_faune    15.6
# 9  C           385.  obs_faune     0  
# 10 D          2941.  obs_faune     1  
# 11 E            45.9 obs_faune     0.3
# 12 F           306.  obs_faune     1  

现在,对于每个faune和flore观察,我们都有一个额外的行。然后,我们可以将列彼此相邻绘制。如果没有position = "dodge",您将获得与上述相同的图。

ggplot(csv_total_long, aes(x = habitates, y = obs, fill = flore_faune)) +
  geom_col(alpha = 0.5, position = "dodge") +
  scale_fill_brewer(palette = "Dark2") +
  theme(axis.text.x = element_text(angle = 50, hjust = 1))

enter image description here

我在这里使用了geom_col,因为它与geom_barstat = "identity"相同。

数据
我用字母表示栖息地,因为原本的系统无法正确识别原始字母,这不是重点。

csv_total <- structure(list(habitates = c("A", "B", "C", "D", "E", "F"), 
                            surf_ha = c(0.4, 0.7, 384.8, 2940.8, 45.9, 306.4), 
                            obs_flore = c(0.0, 0.0, 1.1, 2.1, 2.3, 2.5), 
                            obs_faune = c(2.4, 15.6, 0.0, 1.0, 0.3, 1.0)), 
                       row.names = c(NA, -6L), 
                       class = c("tbl_df", "tbl", "data.frame"))