【问题标题】:ggplot colored lines according to group, how to not connect between missing values根据组的ggplot彩色线,如何不在缺失值之间连接
【发布时间】:2015-07-03 19:48:59
【问题描述】:

我正在绘制风速的时间序列,并希望根据季节为线条着色。整个数据集中有几个缺失的数据,其中一个差距是几个月。 当我根据季节绘制带有颜色的 ggplot 时,不幸的是,它绘制了从季节结束(例如冬季)到本季节下一次出现(例如冬季)的连接线。我怎样才能阻止它这样做?

这是我的数据摘录:

     date                     wspd_havg10m_kn   avg_wd  season
1   2013-12-06 00:25:00     9.8358531   50  Winter
2   2013-12-06 01:25:00     10.5064795  56  Winter
3   2013-12-06 02:25:00     11.8477322  55  Winter
4   2013-12-06 03:25:00     NA              53  NA
5   2013-12-06 04:25:00     13.1889849  47  Winter
6   2013-12-06 05:25:00     13.1889849  60  Winter
7   2013-12-06 06:25:00     NA              51  NA
8   2013-12-06 07:25:00     9.6123110   50  Winter
9   2013-12-06 08:25:00     7.6004320   53  Winter
10  2013-12-06 09:25:00     9.6123110   52  Winter
11  2013-12-06 10:25:00     8.2710583   66  Winter


# add column that specifies the season
mydata$season<-time2season(mydata$date, out.fmt="seasons", type="default")

#capitalize season categories
mydata$season<-capitalize(mydata$season)


g<-ggplot(mydata, aes(date, wspd_havg10m_kn, color=season))+
  geom_line(size=0.1) +
  geom_smooth(colour = "black",size = 1, method = "gam", formula = y ~ s(x), bs = "cs") +  
  scale_y_continuous(limits = c(0,45), breaks = seq(0,45,5))+ 
  scale_color_discrete(name="Season", breaks=c("Spring","Summer","Autumm", "Winter"))+
  xlab("\nSampling Period (mm/yy)\n") +  
  ylab("Hourly Wind Speed Sample (kt)\n")

# adjust the way labels and ticks are set on the x axis:
g+ scale_x_datetime(breaks = date_breaks ("2 months"), labels= date_format ("%m/%y"), limits=c(start_date, end_date))

当我错过风速时,我尝试将季节设置为 NA,但这并没有起到任何作用。上一季到下一季的连线我还留着……

有什么想法吗? 干杯 桑德拉

【问题讨论】:

  • 不知何故,您需要为每个连接的线段生成一个唯一的组 ID。没那么简单……
  • 感谢您的 cmets!有时最难的部分是知道谷歌的内容:-) 我的问题是当我只绘制风速 (wspd_havg10m_kn) 时我没有它。它根据数据集中的 NA 在行中留下间隙。只有当我添加颜色=季节时,我才能得到从季节结束到季节开始的连接线。这就是为什么我认为我只需要在赛季变量中添加 NA,但不幸的是没有成功。
  • 该示例没有很好地处理 NA,并对时间变量如何分配以供 diff 工作进行了一些假设。只要您对时间变量进行了排序,这种方式就适用于一般的 NA。

标签: r ggplot2


【解决方案1】:

由于颜色和 NA,我不认为它是完全重复的。我认为您正在寻找这样的东西:

# Read the data
library(lubridate)
df <- read.csv("data.csv",
               strip.white=T,
               colClasses=c("character","numeric","numeric","factor"))

df$date <- ymd_hms(df$date,tz="UCT")

#define our group variable and plot it
df$grp <- cumsum(is.na(df$wind))
ggplot(data=df[complete.cases(df),],aes(date,wind,color=season)) + 
     geom_line(aes(group=grp)) +
     scale_color_manual(values=c("Fall"="brown","Winter"="darkblue"))   

这是我使用的数据

date,wind,temp,season
2013-12-20 18:25:00,     9.8358531,   50,  Fall
2013-12-20 19:25:00,     10.5064795,  56,  Fall
2013-12-20 20:25:00,     11.8477322,  55,  Fall
2013-12-20 21:25:00,     NA,          53,  NA
2013-12-20 22:25:00,     13.1889849,  47,  Fall
2013-12-20 23:25:00,     13.1889849,  60,  Fall
2013-12-21 01:25:00,     NA,          51,  NA
2013-12-21 02:25:00,     9.6123110,   50,  Winter
2013-12-21 03:25:00,     7.6004320,   53,  Winter
2013-12-21 04:25:00,     9.6123110,   52,  Winter
2013-12-21 05:25:00,     8.2710583,   66,  Winter

【讨论】:

  • 就是这样。现在我想了解它。为什么它与风变量的 cum sum 一起工作?
  • 它与is.na(wind) 变量的cumsum 一起使用。而后者只有在wind的值为NA时才为1。
  • 为了看得更清楚,定义一个辅助列df$windisna &lt;- is.na(df$wind)
猜你喜欢
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多