根据月份绘制每日数据总和值

时间:2018-02-12 04:41:51

标签: r date plot ggplot2 time

我正在尝试在y轴上制作太阳辐照度(来自天气文件),并在x轴上制作月数。

我的数据包含按小时收集的值,为期12个月,因此总共有8760行填充了数据值。

现在,我想以这样一种方式制作情节:在一天中,我只通过添加一整天的值来获得一个关于积分的观点(不像取所有值并绘制它们。我相信{{1可以绘制这种类型的数据。我已经找到了这个,但没有按照我想要的方式找到足够的例子。(或者,如果有一些方法可以帮助我实现我想要的情节,因为我不确定我到底有什么为一天添加积分。否则编写365天的代码是疯狂的)

我想要以下类型的情节 enter image description here

我的情节显示了一年的所有阅读,看起来像这样 enter image description here

我的绘图代码是:

geom_freqpoly()

而我的数据看起来像这样:

library(ggplot2)
cmsaf_data <- read.csv("C://Users//MEJA03514//Desktop//main folder//Irradiation data//tmy_era_25.796_45.547_2005_2014.csv",skip=16, header=T)

time<- strptime(cmsaf_data[,2], format = "%m/%d/%Y %H:%M")

data <- cbind(time,cmsaf_data[5])

#data %>% select(time)
data <- data.frame(data, months = month(time),days = mday(time))
data <- unite(data, date_month, c(months, days), remove=FALSE, sep="-")

data <- subset(data, data[,2]>0)

GHI <- data[,2]
date_month <- data[,3]
ggplot(data, aes(date_month, GHI))+geom_line()

因为我想要一天1点,我怎样才能执行求和功能,这样我就可以得到我需要的输出并在x轴上显示月份名称(可能正在使用时间和日期的东西可以做这个添加一天,在产出中给出365年的价值

我根本不知道任何这样的功能或方法。

我们将非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

为了获得每年每个月的总和,您需要创建一个描述特定年份(Yearmon)特定月份的列。 然后,您可以对该列进行分组,并对该组进行总结,为每年的每个月提供一笔金额。

然后你只需绘制它并根据自己的喜好设置x轴的标签。

library(ggplot2)
library(dplyr)
library(zoo)
library(scales)

# Create dummy data for time column
time <- seq.POSIXt(from = as.POSIXct("2007-01-01 00:00:00"),
                   to = as.POSIXct("2017-01-01 23:00:00"),
                   by = "hour")

# Create dummy data.frame
data <- data.frame(Time = time,
                   GHI = rnorm(length(time)))

############################
# Add column Yearmon to the data.frame
# Groupy by Yearmon and summarise with sum
# This creates one sum per Yearmon
# ungroup is often not neccessary, however 
# not doing this caused problems for me in the past
# Change type of Yearmon to Date for ggplot
#


df <- mutate(data,
       Yearmon = as.yearmon(Time)) %>%
  group_by(Yearmon) %>%
  summarise(GHI_sum = sum(GHI)) %>%
  ungroup() %>%
  mutate(Yearmon = as.Date(Yearmon))


# Plot the chart with special scale lables
ggplot(df, aes(Yearmon, GHI_sum))+
  geom_line()+
  scale_x_date(labels = date_format("%m/%y"))

我希望这会有所帮助。

答案 1 :(得分:1)

这是使用tidyverse和lubridate包的解决方案。由于您还没有提供完整的样本数据,我已经生成了一些随机数据。

library(tidyverse)
library(lubridate)

data <- tibble(
  time = seq(ymd_hms('2007-01-01 00:00:00'),
             ymd_hms('2007-12-31 23:00:00'),
             by='hour'),
  variable = sample(0:400, 8760, replace = TRUE)
)

head(data)
#> # A tibble: 6 x 2
#>   time                variable
#>   <dttm>                 <int>
#> 1 2007-01-01 00:00:00      220
#> 2 2007-01-01 01:00:00      348
#> 3 2007-01-01 02:00:00      360
#> 4 2007-01-01 03:00:00       10
#> 5 2007-01-01 04:00:00       18
#> 6 2007-01-01 05:00:00      227

summarised <- data %>%
  mutate(date = date(time)) %>%
  group_by(date) %>%
  summarise(total = sum(variable))

head(summarised)
#> # A tibble: 6 x 2
#>   date       total
#>   <date>     <int>
#> 1 2007-01-01  5205
#> 2 2007-01-02  3938
#> 3 2007-01-03  5865
#> 4 2007-01-04  5157
#> 5 2007-01-05  4702
#> 6 2007-01-06  4625

summarised %>%
  ggplot(aes(date, total)) +
  geom_line()