为多个时间序列图将数据帧与数据帧隔离

时间:2018-10-03 07:54:34

标签: r dataframe ggplot2

我想提取特定压力水平(press_hpa)下的温度(temp_c)。当我使用dplyr过滤数据(dat)时,我正在创建另一个数据框,其中包含相同的列号(15)和不同的观察长度。有很多解决方案可以从列中绘制多个时间序列,但是我无法匹配该解决方案。.如何绘制显示不同水平温度的多个时间序列(x =日期,y = temp_c,图例= Press_1000,Press_925,Press_850,Press_700 )?请帮忙..谢谢..

library(ggplot2), 
library(dplyr)
library(reshape2)

setwd("C:/Users/Hp/Documents/yr/climatology/")
dat <- read.csv("soundingWMKD.csv", head = TRUE, stringsAsFactors = F)

str(dat)
'data.frame':   6583 obs. of  15 variables:
 $ X        : int  1 2 3 4 5 6 7 8 9 10 ...
 $ pres_hpa : num  1006 1000 993 981 1005 ...
 $ hght_m   : int  16 70 132 238 16 62 141 213 302 329 ...
 $ temp_c   : num  24 23.6 23.2 24.6 24.2 24.2 24 23.8 23.3 23.2 ...
 $ dwpt_c   : num  23.4 22.4 21.5 21.6 23.6 23.1 22.9 22.7 22 21.8 ...
 $ relh_pct : int  96 93 90 83 96 94 94 94 92 92 ...
 $ mixr_g_kg: num  18.4 17.4 16.6 16.9 18.6 ...
 $ drct_deg : int  0 0 NA NA 190 210 212 213 215 215 ...
 $ sknt_knot: int  0 0 NA NA 1 3 6 8 11 11 ...
 $ thta_k   : num  297 297 297 299 297 ...
 $ thte_k   : num  350 347 345 349 351 ...
 $ thtv_k   : num  300 300 300 302 300 ...
 $ date     : chr  "2017-11-02" "2017-11-02" "2017-11-02" "2017-11-02" ...
 $ from_hr  : int  0 0 0 0 0 0 0 0 0 0 ...
 $ to_hr    : int  0 0 0 0 0 0 0 0 0 0 ...

Press_1000 <- filter(dat,dat$pres_hpa == 1000)
Press_925 <- filter(dat,dat$pres_hpa == 925)
Press_850 <- filter(dat,dat$pres_hpa == 850)
Press_700 <- filter(dat,dat$pres_hpa == 700)
date <- as.Date(dat$date, "%m-%d-%y")

str(Press_1000)
'data.frame':   80 obs. of  15 variables:
 $ X        : int  2 6 90 179 267 357 444 531 585 675 ...
 $ pres_hpa : num  1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 ...
 $ hght_m   : int  70 62 63 63 62 73 84 71 74 78 ...
 $ temp_c   : num  23.6 24.2 24.4 24.2 25.4 24 23.8 24 23.8 24 ...
 $ dwpt_c   : num  22.4 23.1 23.2 22.3 23.9 23.1 23.4 23 23 23.1 ...
 $ relh_pct : int  93 94 93 89 91 95 98 94 95 95 ...
 $ mixr_g_kg: num  17.4 18.2 18.3 17.3 19.1 ...
 $ drct_deg : int  0 210 240 210 210 340 205 290 315 0 ...
 $ sknt_knot: int  0 3 2 3 3 2 4 1 1 0 ...
 $ thta_k   : num  297 297 298 297 299 ...
 $ thte_k   : num  347 350 351 348 354 ...
 $ thtv_k   : num  300 301 301 300 302 ...
 $ date     : chr  "2017-11-02" "2017-11-03" "2017-11-04" "2017-11-05" ...
 $ from_hr  : int  0 0 0 0 0 0 0 0 0 0 ...
 $ to_hr    : int  0 0 0 0 0 0 0 0 0 0 ...

 str(Press_925)
'data.frame':   79 obs. of  15 variables:
 $ X        : int  13 96 187 272 365 450 537 593 681 769 ...
 $ pres_hpa : num  925 925 925 925 925 925 925 925 925 925 ...
 $ hght_m   : int  745 747 746 748 757 764 757 758 763 781 ...
 $ temp_c   : num  21.8 22 22.4 23.2 22.2 20.6 22.4 22 22.4 22.2 ...
 $ ... 'truncated'

all_series = rbind(date,Press_1000,Press_925,Press_850,Press_700)

meltdf <- melt(all_series,id.vars ="date")
ggplot(meltdf,aes(x=date,y=value,colour=variable,group=variable)) + 
geom_line()

1 个答案:

答案 0 :(得分:1)

有两种解决方法。您追求的目标可能取决于基岩问题(我们不知道)。

1)对于每个data.frame,您都具有所有必要的列,并且可以使用例如

来绘制每个源(data.frame)。
ggplot()... +
    geom_line(data = Press_1000, aes(...)) +
    geom_line(data = Press_925, aes(...)) ...

请注意,您将必须为每个来源指定颜色,并带有一个图例为PITA。

2)将所有data.frame组合到一个大对象中,并创建一个附加列,指示数据的来源(观察值来自哪个data.frame)。这将是您当前aes调用中的映射变量(例如颜色,填充,分组)。即时传奇。