ggplot绘制多个条形图

时间:2018-08-07 16:52:10

标签: r ggplot2

我有一些薪水数据,分为不同的邻域hood,并进一步细分为不同的收入等级以及每个收入等级的误差范围minmax。我想用每个邻域的误差幅度标出收入等级。以下是我的数据的子集:

hood    PHE_Less than 20k   PHE_Less than 20k max   PHE_Less than 20k min  PHE_20k to 35k   PHE_20k to 35k max  PHE_20k to 35k min
   a                  291                  368.38                  213.62            250                 331.15             168.85
   b                  220                  283.86                  156.14            125                 185.47              64.53
   c                  226                  296.82                  155.18            306                 394.33             217.67
   d                  25                    41.82                    8.18             73                 107.94              38.06

这是我的R代码:

PHE_20k.to.35k <- ggplot ( data = mydata2
     ,aes ( x = hood
           ,y = PHE_20k.to.35k
           ,fill= hood)) +

geom_bar (stat = "identity", group = 2) +

geom_errorbar( aes (ymin = PHE_20k.to.35k.max
                ,ymax = PHE_20k.to.35k.min)
                ,width = .2) +

ylab("20k to 35k") +
xlab("") +

guides (fill = F)

PHE_20k.to.35k

每个罩子只能给我一个收入等级。如何添加另一个?

我想拥有两个收入等级PHE_Less than 20kPHE_20k to 35k,每个hood的误差幅度,并用图例说明哪个收入等级是哪个。实际上,每个社区有4个收入等级,但这将有助于我完成目标。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您要做的第一件事是将数据设置为ggplot2的适当形状。 ggplot的理念是,数据采用长格式,您可以在其中将数据变量分配给不同的颜色(例如颜色或位置),从而动态创建视觉元素。可能需要重塑数据的一个提示是,列具有非常相似的名称-这表明它们包含非常相似的数据。

考虑要绘制的内容以及如何将不同的元素组合在一起。如果我正确理解了该问题,则沿x轴的位置取决于邻域和括号。误差线的位置也取决于邻域和括号。误差线的端点取决于值的最小值和最大值。

我将数据收集为长格式,并使用一些正则表达式函数从key列中提取括号标签和度量类型(最小值,最大值或两者都不包含),其中包含列名之前。提取物为空白的标签本身就是测量值,因此我用replace_na填充了这些内容,然后将其展开,以便对括号和邻域的每种组合分别进行最小,最大和测量。

library(tidyverse)

df_tidy <- df %>%
  gather(key = key, value = value, -hood) %>%
  mutate(bracket = str_extract(key, "(?<=PHE_)(\\w+\\s){2}\\w+")) %>%
  mutate(type = str_extract(key, "(min|max)")) %>%
  select(-key) %>%
  replace_na(list(type = "measure")) %>%
  spread(key = type, value = value)

df_tidy
#>   hood       bracket    max measure    min
#> 1    a    20k to 35k 331.15     250 168.85
#> 2    a Less than 20k 368.38     291 213.62
#> 3    b    20k to 35k 185.47     125  64.53
#> 4    b Less than 20k 283.86     220 156.14
#> 5    c    20k to 35k 394.33     306 217.67
#> 6    c Less than 20k 296.82     226 155.18
#> 7    d    20k to 35k 107.94      73  38.06
#> 8    d Less than 20k  41.82      25   8.18

从此处开始准备绘制数据,并通过闪避将条形图和误差条并排放置。您会注意到的一个问题是如何填充条形图和为错误栏涂色:很难看到错误条重叠的地方。一种选择是降低条形的alpha。

ggplot(df_tidy, aes(x = hood, y = measure, fill = bracket)) +
  geom_col(position = position_dodge(width = 0.9), alpha = 0.5) +
  geom_errorbar(aes(ymin = min, ymax = max, color = bracket), position = position_dodge(width = 0.9), width = 0.4)

另一种方法是手动设置相似的填充和颜色,但错误栏较暗。

ggplot(df_tidy, aes(x = hood, y = measure, fill = bracket)) +
  geom_col(position = position_dodge(width = 0.9)) +
  geom_errorbar(aes(ymin = min, ymax = max, color = bracket), position = position_dodge(width = 0.9), width = 0.4) +
  scale_fill_manual(values = c("skyblue", "tomato")) +
  scale_color_manual(values = c("skyblue4", "tomato4"))

我将那些美学决定留给您。