我有一个包含两个分类变量和一个数值变量的数据表。
下面是生成示例数据的代码:
data <- data.frame(system = rep(c("X","Y","Z"), 10),
region = rep(letters[1:5], 6),
value = rnorm(60, 500, 300))
现在,我想绘制系统区域平均值,并将系统平均值与系统区域平均值叠加。
以下是构建绘图数据和第一个绘图的代码:
plot_data <- data %>%
mutate(system = factor(system), region = factor(region)) %>%
group_by(system, region) %>%
summarise(avg = mean(value), .groups = "drop") %>%
left_join(y = data %>% group_by(system) %>% summarise(avg = mean(value), .groups = "drop"), by = "system", suffix = c("", "_all")) %>%
mutate(point_type = ifelse(avg_all > avg, "above", "in"))
ggplot(plot_data, aes(x = region, y = avg, fill = system)) +
geom_col(position = "dodge") +
geom_point(aes(y = avg_all), shape = 21, position = position_dodge(width = 0.9))
但是现在,如果我想给geom_point添加一种颜色美感,就像这样:
ggplot(plot_data, aes(x = region, y = avg, fill = system)) +
geom_col(position = "dodge") +
geom_point(aes(y = avg_all, color = point_type), shape = 21, position = position_dodge(width = 0.9))
图形不再按照与列相同的顺序排列position.dodge中的点。请注意,在区域“B”中,绿色和蓝色的点/条未对齐,在区域“d”中,红色和绿色的点/条未对齐,在区域“e”中,红色,绿色和蓝色的点/条未对齐。我不能弄清楚原因。未对齐不是系统性的,但我尝试了position = position.dodge2(reverse = T),但没有解决问题。
2条答案
按热度按时间bf1o4zei1#
问题是添加
color
aes改变了用于geom_point
的数据分组。要修复这个问题,你必须使用group
aes,告诉ggplot2
你想用system
对点进行分组和闪避。pw136qt22#
我说得有点晚了,使用
group
已经有了答案,我想说在第一个aes
中使用group = system
,这样它就可以在geoms
之间共享了。另一种选择(这不会给我们提供完全相同的图形,我认为这不是一个很好的解决方案)是在第一个
aes
中定义color
,然后在geom_col
中覆盖它。