使用ggplot绘制大量时间序列。有可能加快速度吗?

时间:2014-08-12 20:18:07

标签: r performance ggplot2 time-series rcurl

我正在处理数千个气象时间序列数据(样本数据可以从这里下载) https://dl.dropboxusercontent.com/s/bxioonfzqa4np6y/timeSeries.txt

在我的Linux Mint PC(64位,8GB RAM,双核2.6 GHz)上使用ggplot2绘制这些数据耗费了大量时间。我想知道是否有办法加快速度或更好地绘制这些数据?非常感谢您提出任何建议!

这是我现在使用的代码

##############################################################################
#### load required libraries        
library(RCurl)
library(dplyr)    
library(reshape2)
library(ggplot2)

##############################################################################
#### Read data from URL
dataURL = "https://dl.dropboxusercontent.com/s/bxioonfzqa4np6y/timeSeries.txt"
tmp <- getURL(dataURL)
df <- tbl_df(read.table(text = tmp, header=TRUE))
df

##############################################################################
#### Plot time series using ggplot2
# Melt the data by date first
df_melt <- melt(df, id="date")
str(df_melt)

df_plot <- ggplot(data = df_melt, aes(x = date, y = value, color = variable)) +
  geom_point() +
  scale_colour_discrete("Station #") +
  xlab("Date") +
  ylab("Daily Precipitation [mm]") +
  ggtitle('Daily precipitation from 1915 to 2011') +
  theme(plot.title = element_text(size=16, face="bold", vjust=2)) + # Change size & distance of the title
  theme(axis.text.x = element_text(angle=0, size=12, vjust=0.5)) + # Change size of tick text
  theme(axis.text.y = element_text(angle=0, size=12, vjust=0.5)) +
  theme( # Move x- & y-axis lables away from the axises
    axis.title.x = element_text(size=14, color="black", vjust=-0.35),
    axis.title.y = element_text(size=14, color="black", vjust=0.35)   
  ) +
  theme(legend.title = element_text(colour="chocolate", size=14, face="bold")) + # Change Legend text size
  guides(colour = guide_legend(override.aes = list(size=4))) + # Change legend symbol size
  guides(fill = guide_legend(ncols=2))
df_plot

1 个答案:

答案 0 :(得分:8)

您的部分问题要求“更好地绘制这些数据”。

在这种精神中,你似乎有两个问题,首先,你希望沿着x轴绘制> 35,000个点,正如一些评论指出的那样,这将导致像素重叠,但是极其严重大型高分辨率显示器。其次,更重要的是IMO,你试图在同一个地块上绘制69个时间序列(台)。在这种情况下,热图可能是更好的方法。

library(data.table)
library(ggplot2)
library(reshape2)          # for melt(...)
library(RColorBrewer)      # for brewer.pal(...)
url <-  "http://dl.dropboxusercontent.com/s/bxioonfzqa4np6y/timeSeries.txt"
dt  <- fread(url)
dt[,Year:=year(as.Date(date))]

dt.melt  <- melt(dt[,-1,with=F],id="Year",variable.name="Station")
dt.agg   <- dt.melt[,list(y=sum(value)),by=list(Year,Station)]
dt.agg[,Station:=factor(Station,levels=rev(levels(Station)))]
ggplot(dt.agg,aes(x=Year,y=Station)) + 
  geom_tile(aes(fill=y)) +
  scale_fill_gradientn("Annual\nPrecip. [mm]",
                       colours=rev(brewer.pal(9,"Spectral")))+
  scale_x_continuous(expand=c(0,0))+
  coord_fixed()

请注意data.tables的使用。您的数据集相当大(因为所有列; 35,000行并不是那么大)。在这种情况下,data.tables将大大加快处理速度,尤其是fread(...),这比基础R中的文本导入功能快得多。