简体   繁体   中英

ggplot is not graphing a vertical line

I am trying to plot a graph in ggplot2 where the x-axis represents month-day combinations, the dots represent y-values for two different groups.

When graphing my original data set using this code,

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)

I get this graph where the vertical line is not showing.

在此处输入图像描述

When I tried to create a reproducible example using the following code...

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)

The vertical line is showing, but now its showing in the wrong place

在此处输入图像描述

In my original data set I have two values for each month-day combination (representing each of the two groups). The month-day combination column is a character vector, it is not a factor and does not have levels.

Here is a way. It subsets the data keeping only the rows of interest and plots the vertical line defined by 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)

在此处输入图像描述

Data

I will repost the data creation code, this time setting the RNG seed in order to make the example reproducible.

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

The reason your line is not showing up where you expect is because you are setting the value of xintercept= via the output of the which() function. which() returns the index value where the condition is true. So in the case of your reproducible example, you get the following:

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

It returns a vector indicating that in df$MONTHDAY , indexes 3 and 4 in that vector are true. So your code below:

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

Reduces down to this:

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

Your MONTHDAY axis is not formatted as a date, but treated as a discrete axis of character vectors. In this case xintercept=c(3,4) applied to a discrete axis draws two vertical lines at x intercepts equivalent to the 3rd and 4th discrete position on that axis: in other words, "01-03" and... some unknown 4th position that is not observable within the axis limits.

How do you fix this? Just take out which() :

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

在此处输入图像描述

We can get the corresponding values of 'MONTHDAY' after subsetting

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

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM