使用ggplot绘制大量时间序列图,有可能加速吗?

7
我正在处理成千上万的气象时间序列数据(示例数据可从此处下载) https://dl.dropboxusercontent.com/s/bxioonfzqa4np6y/timeSeries.txt 在我的Linux Mint电脑上(64位,8GB RAM,双核2.6 GHz),使用ggplot2绘制这些数据花费了很长时间。我想知道是否有加速或更好的绘制方式?非常感谢您提供任何建议!
这是我目前正在使用的代码:
##############################################################################
#### load required libraries
library(RCurl)
library(reshape2)
library(dplyr)
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

6
请勿发布破坏读者工作环境的行代码。 - G. Grothendieck
4
如果您希望在大约100年的时间里每天在“x”轴上呈现一个点,那么这意味着如果您想显示1个像素大小的点,则需要至少35K的宽度来绘制图表。我怀疑这是否真的有必要,为什么不进行聚合呢? - daroczig
2
ggplot2并不是针对大数据进行优化的,而是针对程序员的方便进行优化的。你会发现基础绘图或lattice比ggplot2快100倍。对于ggplot2,您可以考虑先减少数据量,例如通过子采样或聚合来实现。 - Alex Brown
2
提供您的数据和一个可工作的代码示例,将会得到加分。 - jlhoward
3
对不起,经过将近4年后它仍然非常缓慢。 - Tung
显示剩余4条评论
1个回答

11

你的问题中有一部分是关于“更好的方法来绘制这些数据”的。

在这种情况下,你似乎有两个问题。首先,你期望在x轴上绘制超过35,000个点,这意味着除非使用极大的高分辨率显示器,否则会出现像素重叠的问题,正如某些评论所指出的那样。其次,更重要的是,在同一图表上尝试绘制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中的文本导入函数快得多。


感谢@jlhoward提供的想法和使用data.tables的解决方案。我一直想尝试这个包。 - Tung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接