首页 > 解决方案 > ggplot2:使用“limits =”缩放x轴时制作一个仅显示可见数据系列的图例

问题描述

我有时间序列数据,其中并非每个日期的所有系列都完全填充。当我缩放 x 轴以使某些系列不显示可见数据时,我仍然会获得这些系列的图例条目。有没有一种简单的方法可以删除这些图例条目,还是我必须为每个图表手动删除它们?

我可以通过选择只包含数值的数据系列来创建一个新的数据框,然后调用 ggplot,但我想在调用 ggplot 中完成这一切。

样本数据:

dat <- structure(list(Date = structure(c(1493856000, 1493942400, 1494028800, 1494115200, 1494201600, 1494288000),
                                       class = c("POSIXct", "POSIXt"),
                                       tzone = "UTC"),
                      T1 = c(17.7, 23.5, 31.2, NA, NA, NA), 
                      T2 = c(11.4, 15.9, 20.9, 24.3, 15.5, 16.9), 
                      T3 = c(11.2, 16.1, 21.4, 24.7, 15.2, 16.5)), 
                 class = "data.frame", row.names = c(NA, -6L))

使用所有数据创建初始图:

dat <- dat %>% 
  gather(Sensor, Temp, 2:4)

myplot <- ggplot(dat, aes(Date, Temp)) +
  geom_line(aes(color = factor(Sensor))) +
  geom_point(aes(color = factor(Sensor))) +
  labs(x = "",
       y = "Temp, C", 
       color = "Sensor") 

myplot

在此处输入图像描述

接下来,我将 x 轴缩放到 T1 数据全部为 NA 的范围内。图例仍然显示 T1 条目,我想神奇地删除它。

myplot <- myplot +
  scale_x_datetime(limits = c(as.POSIXct("2017-05-06"), as.POSIXct("2017-05-09")))

myplot

在此处输入图像描述

标签: rggplot2

解决方案


使用 2017-05-06 作为开始日期,有一个非 NA T1:

library(tidyverse)
df %>% 
  gather(Sensor, Temp, 2:4) %>% 
  filter(Date >= as.Date("2017-05-06") & Date <= as.Date("2017-05-09")) %>% 
  filter(!is.na(Temp)) 


       Date Sensor Temp
1 2017-05-06     T1 31.2
2 2017-05-06     T2 20.9
3 2017-05-07     T2 24.3
4 2017-05-08     T2 15.5
5 2017-05-09     T2 16.9
6 2017-05-06     T3 21.4
7 2017-05-07     T3 24.7
8 2017-05-08     T3 15.2
9 2017-05-09     T3 16.5

因此产生:

df %>% 
  gather(Sensor, Temp, 2:4) %>% 
  filter(Date >= as.Date("2017-05-06") & Date <= as.Date("2017-05-09")) %>% 
  filter(!is.na(Temp)) %>%
  ggplot(aes(Date, Temp)) +
  geom_line(aes(color = factor(Sensor))) +
  geom_point(aes(color = factor(Sensor))) +
  labs(x = "",
       y = "Temp, C", 
       color = "Sensor") 

图1

将开始日期更改为 2017-05-07,其中所有 T1 值为 NA 会产生以下结果:

df %>% 
  gather(Sensor, Temp, 2:4) %>% 
  filter(Date >= as.Date("2017-05-07") & Date <= as.Date("2017-05-09")) %>% 
  filter(!is.na(Temp)) %>%
  ggplot(aes(Date, Temp)) +
  geom_line(aes(color = factor(Sensor))) +
  geom_point(aes(color = factor(Sensor))) +
  labs(x = "",
       y = "Temp, C", 
       color = "Sensor") 

图2


推荐阅读