ggplot没有绘制垂直线

时间:2020-07-20 20:44:11

标签: r ggplot2

我正在尝试在ggplot2中绘制图形,其中x轴表示月-日组合,点表示两个不同组的y值。

使用此代码绘制原始数据集时,

ggplot(graphing.df, aes(MONTHDAY, y.var, color = GROUP)) +
          geom_point() + 
          ylab(paste0(""))+ 
          scale_x_discrete(breaks = function(x) x[seq(1, length(x), by = 15)])+ 
        theme(legend.text = element_blank(),
              legend.title = element_blank()) + 
          geom_vline(xintercept = which(graphing.df$MONTHDAY == "12-27")[1], col='red', lwd=2)

我得到的这张图没有显示垂直线。

enter image description here

当我尝试使用以下代码创建可复制的示例...

df <- data.frame(MONTHDAY = c("01-01", "01-01", "01-02", "01-02", "01-03", "01-03"),
                                TYPE = rep(c("A", "B"), 3),
                                VALUE = sample(1:10, 6, replace = TRUE))
      
      verticle_line <- "01-02"
      
      ggplot(df, aes(MONTHDAY, VALUE, color = TYPE)) +
          geom_point() + 
          #geom_vline(xintercept = which(df$MONTHDAY == verticle_line)[1], col='red', lwd=2)+ 
          geom_vline(xintercept = which(df$MONTHDAY == verticle_line), col='blue', lwd=2)

显示垂直线,但现在显示在错误的位置

enter image description here

在我的原始数据集中,每个月日组合都有两个值(代表两组)。月日组合列是一个字符向量,它不是一个因素并且没有级别。

3 个答案:

答案 0 :(得分:1)

这是一种方法。它只保留感兴趣的行的数据子集,并绘制由MONTHDAY定义的垂直线。

library(ggplot2)

verticle_line <- "01-02"

ggplot(df, aes(MONTHDAY, VALUE, color = TYPE)) +
  geom_point() + 
  geom_vline(data = subset(df, MONTHDAY == verticle_line),
             mapping = aes(xintercept = MONTHDAY), color = 'blue', size = 2)

enter image description here

数据

我将重新发布数据创建代码,这一次设置RNG种子以使示例可重复。

set.seed(2020)
df <- data.frame(MONTHDAY = c("01-01", "01-01", "01-02", "01-02", "01-03", "01-03"),
                                TYPE = rep(c("A", "B"), 3),
                                VALUE = sample(1:10, 6, replace = TRUE))
      

答案 1 :(得分:1)

您的行未显示在预期位置的原因是因为您正在通过xintercept=函数的输出设置which()的值。 which()返回条件为true的索引值。因此,对于可重现的示例,您将获得以下信息:

> which(df$MONTHDAY == verticle_line)
[1] 3 4

它返回一个向量,指示在df$MONTHDAY中,该向量中的索引3和4为true。因此,您的代码如下:

geom_vline(xintercept = which(df$MONTHDAY == verticle_line)...

归结为:

geom_vline(xintercept = c(3,4)...

您的MONTHDAY轴未格式化为日期,而是被视为字符向量的离散轴。在这种情况下,应用于离散轴的xintercept=c(3,4)在x截距处绘制两条垂直线,等效于该轴上的第3和第4个离散位置:换句话说,“ 01-03”和...某个未知的第4个位置在轴范围内无法观察到。

您如何解决此问题?只需取出which()

ggplot(df, aes(MONTHDAY, VALUE, color = TYPE)) +
  geom_point() + 
  geom_vline(xintercept = verticle_line, col='blue', lwd=2)

enter image description here

答案 2 :(得分:1)

子集设置后,我们可以得到对应的'MONTHDAY'值

ggplot(df, aes(MONTHDAY, VALUE, color = TYPE)) +
      geom_point() + 
      geom_vline(xintercept = df$MONTHDAY[df$MONTHDAY == verticle_line],
                        col='blue', lwd=2)

enter image description here