如何对齐闪避 geom_col 上方的 geom_text 标签
How to align geom_text labels above dodged geom_col
我似乎找不到办法让这个(闪避)上的文本标签geom_col
根据各自的列排列。
我在 SO 和其他网站上尝试了很多建议解决方案,这是我能得到的最接近的解决方案:
我该如何解决这个问题?
代码:
ggplot(leads[leads$key_as_string <= max(leads$key_as_string) - 1, ], aes(fill = type)) +
geom_col(aes(x = key_as_string, y = doc_count),
colour = "black",
position = position_dodge(1)) +
scale_y_continuous(limits = c(0, max(leads$doc_count))) +
geom_text(aes(x = key_as_string, y = doc_count, label = doc_count, group = key_as_string),
hjust = 0.5,
vjust = -0.5,
size = 3,
colour = "black",
position = position_dodge(1)) +
theme(panel.grid.minor.x = element_blank(),
panel.grid.major.x = element_blank(),
axis.text = element_text(colour = "black"))
根据我的评论,group = key_as_string
是这里的罪魁祸首。该代码本质上是告诉 ggplot 将两个具有相同 key_as_string
值的标签保持在同一组中,从而否定 dodge 命令。
下方钻石数据集的插图。我们可以看到删除 group
美学映射会改变标签的位置:
p <- ggplot(diamonds %>%
filter(cut %in% c("Fair", "Good")) %>%
group_by(cut, clarity) %>%
summarise(carat = mean(carat)),
aes(clarity, carat, fill = cut, label = round(carat, 2))) +
geom_col(position = position_dodge(1))
gridExtra::grid.arrange(
p + geom_text(position = position_dodge(1), aes(group = clarity)),
p + geom_text(position = position_dodge(1)),
ncol = 1
)
我似乎找不到办法让这个(闪避)上的文本标签geom_col
根据各自的列排列。
我在 SO 和其他网站上尝试了很多建议解决方案,这是我能得到的最接近的解决方案:
我该如何解决这个问题?
代码:
ggplot(leads[leads$key_as_string <= max(leads$key_as_string) - 1, ], aes(fill = type)) +
geom_col(aes(x = key_as_string, y = doc_count),
colour = "black",
position = position_dodge(1)) +
scale_y_continuous(limits = c(0, max(leads$doc_count))) +
geom_text(aes(x = key_as_string, y = doc_count, label = doc_count, group = key_as_string),
hjust = 0.5,
vjust = -0.5,
size = 3,
colour = "black",
position = position_dodge(1)) +
theme(panel.grid.minor.x = element_blank(),
panel.grid.major.x = element_blank(),
axis.text = element_text(colour = "black"))
根据我的评论,group = key_as_string
是这里的罪魁祸首。该代码本质上是告诉 ggplot 将两个具有相同 key_as_string
值的标签保持在同一组中,从而否定 dodge 命令。
下方钻石数据集的插图。我们可以看到删除 group
美学映射会改变标签的位置:
p <- ggplot(diamonds %>%
filter(cut %in% c("Fair", "Good")) %>%
group_by(cut, clarity) %>%
summarise(carat = mean(carat)),
aes(clarity, carat, fill = cut, label = round(carat, 2))) +
geom_col(position = position_dodge(1))
gridExtra::grid.arrange(
p + geom_text(position = position_dodge(1), aes(group = clarity)),
p + geom_text(position = position_dodge(1)),
ncol = 1
)