根据条形是正数还是负数,自动将 x 轴文本调整到 y=0 的上方或下方

问题描述 投票:0回答:2

我可以在该图中添加哪行代码,以便如果条形为正,则 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... 的东西那就太好了...

r ggplot2 label height x-axis
2个回答
0
投票

只需为文本添加一个新的

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)


0
投票

一种方法是使用两个

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())

© www.soinside.com 2019 - 2024. All rights reserved.