2

在 R ggplot2 中,如何在列之间绘制垂直线

使用 'geom_vline(xintercept=as.numeric(plot_data$mperiod)+0.5)' ,这是行不通的

plot_data <- data.frame(mperiod=paste0('Q',1:4),amount=c(1:4))
plot_data %>% ggplot(aes(x=mperiod,y=amount))+
  geom_bar(stat='identity')+
  geom_vline(xintercept=as.numeric(plot_data$mperiod)+0.5)

当使用 'geom_vline(xintercept=c(1:3)+0.5)' 时,没关系,但我必须手动输入向量。因为实际情况有点复杂,我想自动计算。任何人都可以帮忙吗?谢谢

plot_data %>% ggplot(aes(x=mperiod,y=amount))+
      geom_bar(stat='identity')+
     geom_vline(xintercept=c(1:3)+0.5)
4

2 回答 2

1

这是一个解决方案,我可以帮助你。

library(tidyverse)

plot_data %>%
  ggplot(aes(x=mperiod,y=amount))+
  geom_bar(stat='identity')+
  geom_vline(aes(xintercept = parse_number(mperiod) + .5))

在此处输入图像描述

于 2021-09-10T01:29:53.847 回答
1

在内部,geom_barplot将字符标签转换为整数1,2,3, ...。这些用作条的位置。获取垂直线位置的一种方法是将字符向量转换mperiod为因子,然后转换为numeric,然后它们将变为1,2,3...。然后加上 0.5(定位在条形之间)。

library(magrittr)
library(ggplot2)
plot_data <- data.frame(mperiod=paste0('Q',1:4),amount=c(1:4))
plot_data %>% ggplot(aes(x=mperiod,y=amount))+
  geom_bar(stat='identity')+
  geom_vline(aes(xintercept=as.numeric(as.factor(mperiod))+0.5))

在此处输入图像描述

如果您不希望这条线位于右端,这是一种方法。诀窍是减 0.5 而不是加,所以位置是0.5, 1.5, .... 并使用pmax将 0.5 移动到 1.5。

plot_data %>% ggplot(aes(x=mperiod,y=amount))+
  geom_bar(stat='identity')+
  geom_vline(aes(xintercept=pmax(1.5, as.numeric(as.factor(mperiod))-0.5)))

在此处输入图像描述

于 2021-09-10T01:44:31.360 回答