gpt4 book ai didi

r - 使用正值和负值时如何正确对齐条形顶部的标签

转载 作者:行者123 更新时间:2023-12-04 12:04:13 25 4
gpt4 key购买 nike

我正在使用 ggplot2 做一个情节和一个小数据框 df .我的数据框有一个组变量 Letter和两个数值变量 XY (我在本文末尾包含了 dput() 版本的 df)。
当我尝试对齐顶部条形的标签时,出现了我的主要问题。由于我的设计,一个变量需要显示在右侧,另一个需要显示在左侧。这就是我将一些值乘以 -1 的原因。这是我的情节的代码和输出:

library(tidyverse)
library(ggplot2)
#Plot
df %>%
pivot_longer(-c(Letter)) %>%
mutate(value=ifelse(name=='X',value*-1,value)) %>%
ggplot(aes(x=Letter,y=value,fill=name))+
geom_bar(stat = 'identity',color='black',alpha=0.7)+
geom_text(aes(label=format(abs(value),big.mark = '.')),
size=3,fontface='bold')+
scale_x_discrete(limits = rev(unique(df$Letter)))+
scale_y_continuous(labels = function(x) scales::comma(abs(x)),
breaks = scales::pretty_breaks(10))+
coord_flip()
和输出:
enter image description here
如您所见,情节很好,但问题出在标签上。在左右两侧,标签的一部分在条形内部,另一部分在外部。我想在每个条形顶部的两侧都有标签。我不知道这是否可能,因为有些值是正的,有些是负的。我试过添加 hjustgeom_text()这仅适用于左侧:
#Plot 1
df %>%
pivot_longer(-c(Letter)) %>%
mutate(value=ifelse(name=='X',value*-1,value)) %>%
ggplot(aes(x=Letter,y=value,fill=name))+
geom_bar(stat = 'identity',color='black',alpha=0.7)+
geom_text(aes(label=format(abs(value),big.mark = '.')),
size=3,fontface='bold',
hjust=1)+
scale_x_discrete(limits = rev(unique(df$Letter)))+
scale_y_continuous(labels = function(x) scales::comma(abs(x)),
breaks = scales::pretty_breaks(10))+
coord_flip()
输出:
enter image description here
我想找到一种方法使两侧的标签与各自条的顶部对齐。
非常感谢您的帮助。 dput()我的数据是下一个:
#Data
df <- structure(list(Letter = c("A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S"),
X = c(3099, 14201, 18901, 17351, 29498, 28928, 32284, 31536,
25334, 20008, 39242, 35856, 43317, 53765, 44652, 32876, 26142,
18567, 8836), Y = c(9482, 22669, 11159, 9506, 12113, 12805,
10570, 10199, 9190, 9217, 10674, 10894, 11986, 15664, 12793,
10552, 8050, 8609, 7717)), row.names = c(NA, -19L), class = c("tbl_df",
"tbl", "data.frame"))

最佳答案

您实际上可以设置 hjust作为审美变量,而不是给所有标签相同的 hjust 值。只需通过执行 hjust = value < 0 给它一个负值的 1 和正值的 0内aes call - 生成的逻辑向量将隐式转换为 1 和 0:

df %>%
pivot_longer(-c(Letter)) %>%
mutate(value = ifelse(name == 'X', value * -1, value)) %>%
ggplot(aes(x = Letter, y = value, fill = name)) +
geom_bar(stat = 'identity', color = 'black', alpha = 0.7) +
geom_text(aes(label = format(abs(value), big.mark = '.'), hjust = value < 0),
size = 3, fontface = 'bold') +
scale_x_discrete(limits = rev(unique(df$Letter))) +
scale_y_continuous(labels = function(x) scales::comma(abs(x)),
breaks = scales::pretty_breaks(10)) +
coord_flip()
enter image description here

关于r - 使用正值和负值时如何正确对齐条形顶部的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69500490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com