R ggplot2:制作一个图例,当使用“x”缩放x轴时,该图例仅显示可见的数据系列;限值=”;

R ggplot2:制作一个图例,当使用“x”缩放x轴时,该图例仅显示可见的数据系列;限值=”;,r,ggplot2,R,Ggplot2,我有timeseries数据,其中并非所有序列都为每个日期完全填充。当我缩放x轴时,某些序列显示不可见数据,我仍然会得到这些序列的图例条目。有没有一种简单的方法可以删除这些图例条目,或者我必须为每个图表手动删除它们 我可以通过选择只包含数值的数据系列来创建一个新的数据帧,然后调用ggplot,但我想在调用ggplot的内部完成这一切 样本数据: dat <- structure(list(Date = structure(c(1493856000, 1493942400, 14940288

我有timeseries数据,其中并非所有序列都为每个日期完全填充。当我缩放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使用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
库(tidyverse)
df%>%
聚集(传感器,温度,2:4)%>%
过滤器(日期>=截止日期(“2017-05-06”)和日期%
过滤器(!is.na(温度))
日期传感器温度
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 t215.5
5 2017-05-09 t216.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") 
df%>%
聚集(传感器,温度,2:4)%>%
过滤器(日期>=截止日期(“2017-05-06”)和日期%
过滤器(!is.na(Temp))%>%
ggplot(aes(日期、温度))+
几何线(aes(颜色=系数(传感器)))+
几何点(aes(颜色=系数(传感器)))+
实验室(x=“”,
y=“温度,C”,
color=“传感器”)

将开始日期更改为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") 
df%>%
聚集(传感器,温度,2:4)%>%
过滤器(日期>=截止日期(“2017-05-07”)和日期%
过滤器(!is.na(Temp))%>%
ggplot(aes(日期、温度))+
几何线(aes(颜色=系数(传感器)))+
几何点(aes(颜色=系数(传感器)))+
实验室(x=“”,
y=“温度,C”,
color=“传感器”)

不确定这是否解决了您的问题,但您可以使用
lims
选择要在图例中显示的颜色。例如
lims(color=c('T2','T3'))
@Chris您的建议很有效!但是,我必须根据事先知道图表上显示了哪个系列的数据来选择该系列。任何自动操作都可以做到这一点吗?如果您希望它是自动的,为什么不先对数据本身进行自动操作,然后再使用
过滤器对您想要的日期进行绘图r plot?@Chris-我的数据集很大,我选择了很多日期范围来进行绘图。因此,如果我在调用ggplot之前进行了限制,我似乎必须为每个绘图创建一个新的数据框。这个答案有用吗:?谢谢。正如@Chris所建议的,我想我需要在调用ggplot之前进行筛选。我希望有一种简单的方法来更改数据框默认行为。
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") 
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")