带有最小值和最大值的geom_area图

时间:2018-07-26 08:04:51

标签: r ggplot2 dplyr

我一直在尝试绘制温度的最小值和最大值。我实际上想使用geom_area进行绘制。我的数据可以从answer下载。

library(dplyr)
library(ggplot2)

dat <- read.csv("energydata_complete.csv", stringsAsFactors = FALSE)

#renaming attributes meaningfully
#names(dat)[] <- 'temp_kitchen'
dat <- dat %>% 
dplyr::rename('temp_kitchen'=T1,'temp_living'=T2,'temp_laundry'=T3,
                         'temp_office'=T4,'temp_bath'=T5,'temp_build'=T6,'temp_iron'=T7,
                         'temp_teen'=T8,'temp_parent'=T9,'hum_kitchen'=RH_1,'hum_living'=RH_2,
                         'hum_laundry'=RH_3,'hum_office'=RH_4,'hum_bath'=RH_5,'hum_build'=RH_6,
                         'hum_iron'=RH_7,'hum_teen'=RH_8,'hum_parent'=RH_9)
dat$month <- as.factor(months(dat$date))
dat$date <- strptime(dat$date, format = "%Y-%m-%d %H:%M:%S")
dat$date <- as.POSIXct(dat$date, format = "%Y-%m-%d %H:%M:%S")

我创建了另一个数据框,其中包含每个房间的月份,最低和最高温度值。

temparature <- dat %>% group_by(month) %>% dplyr::summarise(min_temp_kitch=min(temp_kitchen),
                                                 max_temp_kitch=max(temp_kitchen),
                                                 min_temp_living=min(temp_living),
                                                 max_temp_living=max(temp_living),
                                                 min_temp_laundry=min(temp_laundry),
                                                 max_temp_laundry=max(temp_laundry),
                                                 min_temp_iron=min(temp_iron),
                                                 max_temp_iron=max(temp_iron),
                                                 min_temp_office=min(temp_office),
                                                 max_temp_office=max(temp_office),
                                                 min_temp_bath=min(temp_bath),
                                                 max_temp_bath=max(temp_bath),
                                                 min_temp_parent=min(temp_parent),
                                                 max_temp_parent=max(temp_parent),
                                                 min_temp_teen=min(temp_teen),
                                                 max_temp_teen=max(temp_teen))

现在,我正在尝试从此数据框中为每个房间绘制最低和最高温度值。

下面的代码没有给出任何图解。

ggplot() + geom_area(data = temparature,aes(x=month,y=min_temp_kitch), position = 'stack') +
  geom_area(data = temparature,aes(x=month, y=max_temp_kitch), position = 'stack')

尝试使用geom_ribbon进行创建,如下所示。

ggplot(temparature) + 
  geom_ribbon(aes(x=month, ymin = min_temp_kitch, ymax = max_temp_kitch), color='blue', alpha = 0.5)

这给了here

但是我想要一个类似的图,每个值都有点。 enter image description here

有人可以建议如何做吗。

1 个答案:

答案 0 :(得分:0)

您无需将日期更改为因数,也无需将温度数据框设置为长格式:

library(dplyr)
library(ggplot2)
library(lubridate)
dat <- read.csv("energydata_complete.csv", stringsAsFactors = FALSE)


dat <- dat %>% 
  rename('temp_kitchen'=T1,'temp_living'=T2,'temp_laundry'=T3,
            'temp_office'=T4,'temp_bath'=T5,'temp_build'=T6,'temp_iron'=T7,
            'temp_teen'=T8,'temp_parent'=T9,'hum_kitchen'=RH_1,'hum_living'=RH_2,
            'hum_laundry'=RH_3,'hum_office'=RH_4,'hum_bath'=RH_5,'hum_build'=RH_6,
            'hum_iron'=RH_7,'hum_teen'=RH_8,'hum_parent'=RH_9) %>%
  mutate(month = floor_date(date(date), unit = 'months'))


temparature <- dat %>%
  group_by(month) %>%
    summarise(min_temp_kitch=min(temp_kitchen),
               max_temp_kitch=max(temp_kitchen),
               min_temp_living=min(temp_living),
               max_temp_living=max(temp_living),
               min_temp_laundry=min(temp_laundry),
               max_temp_laundry=max(temp_laundry),
               min_temp_iron=min(temp_iron),
               max_temp_iron=max(temp_iron),
               min_temp_office=min(temp_office),
               max_temp_office=max(temp_office),
               min_temp_bath=min(temp_bath),
               max_temp_bath=max(temp_bath),
               min_temp_parent=min(temp_parent),
               max_temp_parent=max(temp_parent),
               min_temp_teen=min(temp_teen),
               max_temp_teen=max(temp_teen))


temp2 <- temparature %>%
    tidyr::gather(temp_min_max, Temp, -month)


ggplot() + 
  geom_area(data = temp2 %>%
          filter(temp_min_max %in% c('min_temp_kitch', 'max_temp_kitch')),
        aes(x=month,y=Temp,fill = temp_min_max, color = temp_min_max),
        position = 'identity') 

enter image description here