繁体   English   中英

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

[英]DateTime limits of scale_color_gradient not working only when in for loop in R

我想在基本地图(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" ...

当我一次一个星期做一次这些代码时,它们就会完全显示出我想要的内容:

在此处输入图片说明

美丽。 但是,当我尝试将其放入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)))中的错误:必须提供'origin'

我唯一更改的是用nm [i]交换了'2016-35'。 我尝试过多次语法转换。 我收到各种错误消息,但大多是上面的错误消息。 提供原点时,无论以哪种格式输入,都会出现以下错误。

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

对此,为什么只在For循环中变得不灵通的任何线索,我们深表感谢。 我是否需要以不同的方式构造循环以读取数据? 我应该使用:

for i in seq_along(nm)    #???

我迷路了!

经过更多研究,我发现了这一点。 我不得不对其进行一些重组,但是我得到了一些可行的方法。 在使用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=""))
 }

通过添加首先隔离数据帧的额外步骤,它简化了我的代码,并使它平稳运行。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM