在 R 中的 scale_x_discrete 之后 geom_vline 不起作用
Posted
技术标签:
【中文标题】在 R 中的 scale_x_discrete 之后 geom_vline 不起作用【英文标题】:geom_vline doesn't work after the scale_x_discrete in R 【发布时间】:2020-03-15 05:26:02 【问题描述】:我是这里的新手,很抱歉没有正确写出问题:p
1,目的是绘制关于我的研究地点(命名为 RB1)的一段时间内(从 2019-05 到 2019-10 选择 8 个日期)内的平均 NDVI 值的图表。并绘制垂直线以显示割草事件的日期。
2,现在我已经计算了这 8 个选定日期的 NDVI 值并制作了一个 CSV 文件。 (PS.“切割”是指研究地点的草地已经被切割,所以对应的日期应该显示为垂直线,使用geom_vline)
infor <- read_csv("plotting information.csv")
infor
# A tibble: 142 x 3
date NDVI cutting
<date> <dbl> <lgl>
1 2019-05-12 NA NA
2 2019-05-13 NA NA
3 2019-05-14 NA NA
4 2019-05-15 NA NA
5 2019-05-16 NA NA
6 2019-05-17 0.787 TRUE
# ... with 132 more rows
3,问题是,当我做 ggplot 时,首先我想将 x 轴保持为整个时间段(2019-05 到 2019-10),但当然不会显示其间的所有日期,否则会有将在 x 轴上显示太多日期)。所以,我使用scale_x_discrte(breaks=, labels=)
来显示带有 NDVI 值的具体日期。
其次,我还想显示割草的日期geom_vline
。
但是,scale_x_discrte
的前提条件似乎是factor
我的日期,而geom_vline
的前提条件是保持日期为nummeric
。
这两个呼吁似乎是矛盾的。
y1 <- ggplot(infor, aes(factor(date), NDVI, group = 1)) +
geom_point() +
geom_line(data=infor[!is.na(infor$NDVI),]) +
scale_x_discrete(breaks = c("2019-05-17", "2019-06-18", "2019-06-26", "2019-06-28","2019-07-23","2019-07-28", "2019-08-27","2019-08-30", "2019-09-21"),
labels = c("0517","0618","0626","0628","0723","0728", "0827","0830","0921")))
y2 <- ggplot(infor, aes(date, NDVI, group = 1)) +
geom_point() +
geom_line(data=infor[!is.na(infor$NDVI),]))
当我在 y1 中添加 geom_vline 时,我的绘图上不显示垂直线: y1 + geom_vline
当我在 y2 中添加它时,显示了垂直线,但日期(x 轴)很奇怪(不显示为 y1,因为我们不在这里运行 scale_x_) y2 + geom_vline
y1 +
geom_vline(data=filter(infor,cutting == "TRUE"), aes(xintercept = as.numeric(date)), color = "red", linetype ="dashed")
如果您能提供帮助,我们将不胜感激! 提前致谢! :D
【问题讨论】:
如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。 您已将 x 轴上的日期变量转换为ggplot
调用中的一个因素,但随后尝试通过将日期设为数字来设置 x 截距。这两者之间可能存在冲突,因为现在它们将具有不同的范围。老实说,这两种方法似乎都不是一个好方法——为什么不将日期保留为日期?
感谢您的建议!我把日期变成了一个因素,因为这可以确保 scale_x_discrete 工作。为什么我需要这样做 scale_x 是因为我想将所有时间段(2019-05 到 2019-10)保留在我的 x 轴上,但同时只显示带有 NDVI 的特定日期。所以我做休息和标签。
我用一些图表编辑了我的问题。希望我能更清楚地描述我的问题。你也可以看看;)
【参考方案1】:
我同意关于将日期保留为日期的评论。在这种情况下,您可以将 geom_vline
的 x 截距指定为日期。
给定基本数据:
df <- tribble(
~Date, ~Volume, ~Cut,
'1-1-2010', 123456, 'FALSE',
'5-1-2010', 789012, 'TRUE',
'9-1-2010', 5858585, 'TRUE',
'12-31-2010', 2543425, 'FALSE'
)
我设置了日期,然后将Cut=='TRUE'
的子集拉到一个新对象中:
df <- mutate(df, Date = lubridate::mdy(Date))
d2 <- filter(df, Cut == 'TRUE') %>% pull(Date)
最后使用对象指定截距:
df %>%
ggplot(aes(x = Date, y = Volume)) +
geom_vline(xintercept = d2) +
geom_line()
【讨论】:
感谢您的回答! :) 我运行你的代码,结果就像我在 y2 + geom_vline 中得到的一样。同样的问题是 x 轴没有显示确切的日期(仅显示为 2010 年 1 月,2010 年 4 月......)。这就是为什么我尝试应用 scale_x_discrete 来打破和标记特定日期(例如 2010-05-01、2019-09-01)的原因。 我用一些图表编辑了我的问题。你也可以看看;)以上是关于在 R 中的 scale_x_discrete 之后 geom_vline 不起作用的主要内容,如果未能解决你的问题,请参考以下文章