年度时间序列的R热图全年

时间:2016-02-23 21:48:51

标签: r date ggplot2 time-series heatmap

我正试图在R河口制作几年日均盐度平均值的热图。

我希望格式在x轴上包含月份,在y轴上包含年份,因此每个1月1日直接在1月1日的另一个上面。换句话说,不像典型的年度日历样式(不像这样:http://www.r-bloggers.com/ggplot2-time-series-heatmaps/)。

到目前为止,我只能在一年中的日子使用:

{r} d <- read.xlsx('GC salinity transposed.xlsx', sheetName = "vert-3", header = TRUE, stringsAsFactors = FALSE, colClasses = c("integer", "integer", "numeric"), endRow = 2254)

{r} ggplot(d, aes(x = Day.Number, y = Year)) + geom_tile(aes(fill = Salinity)) + scale_fill_gradient(name = 'Mean Daily Salinity', low = 'white', high = 'blue') + theme(axis.title.y = element_blank())

得到这个: heat map not quite right

有人可以告诉我一个更好的方法吗 - 这种方式包括月份,而不是沿着x轴的一年中的某一天?谢谢。 R的新人。

1 个答案:

答案 0 :(得分:2)

rubridate包对这样的东西派上用场。这段代码是否符合您的要求?我假设你每个月只有一个盐度读数,并且不需要在同一个月内对多个值进行平均。

library(lubridate)
library(ggplot2)

# Define some data
df <- data.frame(date = seq.Date(from = as.Date("2015-01-01"), by = 1, length.out = 400),
                 salinity = runif(400, min=5, max=7))
# Create fields for plotting
df$day <- paste0(ifelse(month(df$date)<10,"0",""),
                 month(df$date),
                 "-",
                 ifelse(day(df$date)<10,"0",""),
                 day(df$date))
df$month <- paste0(ifelse(month(df$date)<10,"0",""),
                   month(df$date))
df$year <- year(df$date)
library(lubridate)
library(ggplot2)

# Define some data
df <- data.frame(date = seq.Date(from = as.Date("2015-01-01"), by = 1, length.out = 400),
                 salinity = runif(400, min=5, max=7))
# Create fields for plotting
df$day <- paste0(ifelse(month(df$date)<10,"0",""),
                 month(df$date),
                 "-",
                 ifelse(day(df$date)<10,"0",""),
                 day(df$date))
df$month <- paste0(ifelse(month(df$date)<10,"0",""),
                   month(df$date))
df$year <- year(df$date)
#Plot results by month
ggplot(data=df) +
  geom_tile(aes(x = month, y = year, fill = salinity)) +
  scale_y_continuous(breaks = c(2015,2016))
#Plot results by day
ggplot(data=df) +
  geom_tile(aes(x = day, y = year, fill = salinity)) +
  scale_y_continuous(breaks = c(2015,2016))

按月结果:

enter image description here

白天的结果(你真的想要这个吗?用366个x轴值读取很难): enter image description here