我正在尝试在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)
我得到的这张图没有显示垂直线。
当我尝试使用以下代码创建可复制的示例...
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)
显示垂直线,但现在显示在错误的位置
在我的原始数据集中,每个月日组合都有两个值(代表两组)。月日组合列是一个字符向量,它不是一个因素并且没有级别。
答案 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)
数据
我将重新发布数据创建代码,这一次设置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)
答案 2 :(得分:1)