在 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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

技术贴 | R语言:ggplot画柱形图排序着色

ggplot:离散x轴的线图

Android插件化学习之路之使用插件中的R资源

ggplot 不会绘制缺失的类别

R语言之创建数据集

从零开始学习R语言——数据结构之“列表(List)”