我可以在该图中添加哪行代码,以便如果条形为正,则 x 轴标签出现在高度 y=0 的正下方;如果条形为负,则 x 轴标签出现在高度 y=0 的正上方?
我需要生成另一张图,该图只有 4 个条形图(不同的 x 轴标签),并且我希望代码也适用于该图,即不特定于该图中的标签,因此我可以将它们分面。
我认为如果有类似 if y >0 then x-axis label at y=-1 else x-axis label at y=1... 的东西那就太好了...
只需为文本添加一个新的
y
值,该值基于条形图真实 y
值的符号。
library(ggplot2)
# original data
data.frame(x=1:5, y=c(20,10,2,-4,-9), lbl=letters[1:5]) |>
# add a new `y` that is based on the sign of the real data
transform(label_y = 2 * -sign(y)) |>
ggplot(aes(x, y)) +
geom_bar(stat = "identity") +
geom_text(aes(y = label_y, label = lbl))
2*
的使用取决于您的真实价值观,请随意使用。
作为替代方案,如果您希望上方/下方的值不对称,您可以将
2*sign(y)
替换为 ifelse(y < 0, 3, -2)
。
一种方法是使用两个
annotate()
,一个表示正,一个表示负:
library(ggplot2)
df <- data.frame(x = 1:6,
y = c(21, 12, 1, -10, -12, -22))
ggplot(df, aes(x = x, y = y)) +
geom_col() +
annotate("text",
x = df[df$y >= 0,1],
y = 0,
label = df[df$y >= 0,1],
hjust = 0.5,
vjust = 1.2,
colour = "black",
size = 4) +
annotate("text",
x = df[df$y < 0,1],
y = 0,
label = df[df$y < 0,1],
hjust = 0.5,
vjust = -0.2,
colour = "black",
size = 4) +
theme(axis.title = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank())