scale_color_gradient的DateTime限制仅在R中的for循环中不起作用

时间:2016-10-16 16:02:14

标签: r datetime gradient datetime-format limits

我想在基本地图(TMap)上生成多个地图。基本上,相同的地图,但按周分类。

好的,这是基本代码:

library(ggplot2)
library(ggmap)
library(lubridate)

map=TMap + geom_point(aes(x=Lon, y=Lat, size=count, color=as.Date(y$`2016-35`$DateTime)), data=y$`2016-35`, alpha=1) +
scale_colour_gradient(limits=as.Date(c(min(y$`2016-35`$DateTime), max(y$`2016-35`$DateTime))),low="navy", high="orange", name="Date", trans="date")
ggsave(map,path=dir,filename = paste("l","test",".png", sep=""))

y =我正在使用的数据帧列表。

'2016-35'=这只是一周的数据,即y列表中的一个数据帧。

每个数据框如下所示:

Tower Tag_ID       HourID count    week       Lon      Lat           DateTime   day
T01     53 2016-38_3_22    95 2016-38 -94.44542 42.81252 2016-09-21 22:00:00   Wed
T01     53  2016-38_4_1    95 2016-38 -94.44542 42.81252 2016-09-22 01:00:00 Thurs
T01     53 2016-35_7_22    82 2016-35 -94.44542 42.81252 2016-08-28 22:00:00   Sun
T01     53 2016-35_7_21   177 2016-35 -94.44542 42.81252 2016-08-28 21:00:00   Sun
T01     53  2016-35_6_1   143 2016-35 -94.44542 42.81252 2016-09-03 01:00:00   Sat


> str()
'data.frame':   671 obs. of  9 variables:
$ Tower   : chr  "T01" "T01" "T01" "T01" ...
$ Tag_ID  : int  53 53 53 53 53 53 53 53 53 53 ...
$ HourID  : chr  "2016-38_3_22" "2016-38_4_1" "2016-35_7_22" "2016-35_7_21" ...
$ count   : int  95 95 82 177 143 103 75 85 107 162 ...
$ week    : chr  "2016-38" "2016-38" "2016-35" "2016-35" ...
$ Lon     : num  -94.4 -94.4 -94.4 -94.4 -94.4 ...
$ Lat     : num  42.8 42.8 42.8 42.8 42.8 ...
$ DateTime: POSIXct, format: "2016-09-21 22:00:00" "2016-09-22 01:00:00" ...
$ day     : chr  "Wed" "Thurs" "Sun" "Sun" ...

当我一次这样做一周时,这段代码完全吐出我想要的东西:

enter image description here

B-E-A-utiful。但是,当我尝试将它放入for循环时,一切都转到sh * t。

dir=choose.dir()
nm <- names(y)
for (i in 1:length(nm)) {
    map=TMap + geom_point(aes(x=Lon, y=Lat, size=count, color=as.Date(y$nm[i]$DateTime)), data=y$nm[i], alpha=1) +
    scale_colour_gradient(limits=as.Date(c(min(y$nm[i]$DateTime), max(y$nm[i]$DateTime))),low="navy", high="orange", name="Date", trans="date")
    ggsave(map,path=dir,filename = paste("l",nm[i],".png", sep=""))
 }

我收到以下错误消息: as.Date.numeric中的错误(c(min(y $ nm [i] $ DateTime),max(y $ nm [i] $ DateTime))):   必须提供“原产地”

我改变的唯一一件事是用nm [i]交换'2016-35'。我尝试过多次转换语法。我收到了各种错误消息,但主要是上面的错误消息。当我提供原点时,无论我把它放入什么格式,它都会给我以下错误。

charToDate(x)出错:   字符串不是标准的明确格式

为什么这只是在For循环中变得不稳定的任何线索都非常感谢。我是否需要以不同方式构造循环以便读取数据?我应该使用:

for i in seq_along(nm)    #???

我迷路了!

1 个答案:

答案 0 :(得分:0)

经过一番研究后,我想出了这一点。我不得不重新调整它,但我得到了一些有用的东西。我在使用print()运行映射代码之前解析每个数据帧。

for (name in names(y)) {
    q= print(y[[name]])
    map=TMap + geom_point(aes(x=Lon, y=Lat, size=count, color=as.Date(DateTime)), data=q, alpha=1) +
    scale_colour_gradient(limits=as.Date(c(min(q$DateTime), max(q$DateTime)), origin = "1970-01-01"),low="navy", high="orange", name="Date", trans="date")
    ggsave(map,path=dir,filename = paste("l",print(name),".png", sep=""))
 }

通过添加首先隔离数据帧的额外步骤,它使我的代码简单并使其顺利运行。

祝你好运!