我有一些薪水数据,分为不同的邻域hood
,并进一步细分为不同的收入等级以及每个收入等级的误差范围min
和max
。我想用每个邻域的误差幅度标出收入等级。以下是我的数据的子集:
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 20k
和PHE_20k to 35k
,每个hood
的误差幅度,并用图例说明哪个收入等级是哪个。实际上,每个社区有4个收入等级,但这将有助于我完成目标。
任何帮助将不胜感激!
答案 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"))
我将那些美学决定留给您。