使用ggplot2
,我试图根据他们的类别使用2种不同的颜色为一组特定的颜色着色。在下面的图中,我有一些红色的特定值的列,但由于我的方法,它从着色中排除了他们的“伙伴列”(它们顶部的cols),当我希望它们填充蓝色时。
如果我更改scale_fill_manual()
中的值,则它不会执行任何操作,因为'fill'表达式会优先为'TRUE'和'FALSE'类别着色。
如何更改我的代码,使填充红条附带的条形图显示为蓝色?
我目前的情节:
我的代码:
pop %>%
group_by(age_range, sex) %>%
summarize(population = sum(population)) %>%
mutate(prop = population / sum(population)) %>%
ggplot() +
geom_col(aes(x = age_range, y = prop, color = sex,
fill = (prop >= .504 & sex == 'female' & age_range != '75 - 79'),
width = .85),
position = 'dodge') +
scale_fill_manual(values = c('Grey60', 'Grey60', 'Blue', 'Red')) +
scale_color_manual(values = c('Red', 'Blue')) +
geom_text(aes(x = age_range, y = prop, fill = sex, label = percent(prop)),
position = position_dodge(width = .9),
vjust = .358, hjust = 1.1,size = 4, color = 'White') +
scale_y_continuous(limits = c(0, 1), expand = c(0,0)) +
geom_hline(yintercept = .504, color = 'Grey', alpha = .7) +
coord_flip()
答案 0 :(得分:1)
这是一种方法:
# define TRUE / FALSE condition, then assign the same condition
# to the male group within the same age range
pop <- pop %>%
mutate(condition = prop >= 0.504 & sex == "female" & age_range != '75 - 79') %>%
group_by(age_range) %>%
mutate(condition = any(condition))
# define colour / fill scale for gender
sex.scale <- c("female" = "red", "male" = "blue")
ggplot(pop,
aes(x = age_range, y = prop,
color = sex, group = sex,
label = scales::percent(prop))) +
# bars with colored outlines & grey fill
geom_col(position = "dodge", fill = "grey60") +
# bars with coloured fill; only visible if condition is TRUE
geom_col(aes(fill = sex, alpha = condition),
position = "dodge") +
scale_color_manual(values = sex.scale) +
scale_fill_manual(values = sex.scale, guide = F) +
scale_alpha_manual(values = c("TRUE" = 1, "FALSE" = 0)) +
geom_text(position = position_dodge(width = .9),
vjust = .358, hjust = 1.1,
size = 4,
color = 'White') +
scale_y_continuous(limits = c(0, 1), expand = c(0,0)) +
geom_hline(yintercept = .504, color = 'Grey', alpha = .7) +
coord_flip()
样本子集数据:
pop <- data.frame(
age_range = rep(c("10-14", "15-19", "20-24", "25-29"), each = 2),
sex = rep(c("male", "female"), by = 4),
prop = c(0.51, 0.49, 0.518, 0.482, 0.495, 0.505, 0.446, 0.554)
)