我有一个这样的数据框:
> video
id oldid year month day lon lat colour
01208513 Continent 1885 1 1 -30.7 -32.65 #FFFFFF
04960001 05890280 1885 1 1 122.72 26.17 #FDFEFF
05520001 CornFMort 1885 1 1 -22.84 48.34 #FBFDFF
06058 06058 1885 1 1 -61.5 36.5 #F9FCFF
06251 06251 1885 1 1 -113.5 -2.5 #F7FBFF
06323 06323 1885 1 1 174.5 -26.5 #F5FAFF
06466 06466 1885 1 1 -115.5 -40.5 #F3F9FF
106323 106323 1885 1 1 177.5 -26.5 #F1F8FF
我已根据其ID
为每个数据指定了颜色z <- unique(video$id)
range01 <- function(x)(x-min(x))/diff(range(x))
rainbow(7)
cRamp <- function(x){
cols <- colorRamp(colours())(range01(x))
apply(cols, 1, function(xt)rgb(xt[1], xt[2], xt[3], maxColorValue=255))
}
video$col <- as.factor(cRamp(match(video$id,z)))
我想要做的事实是每天用lon
和lat
绘制区分不同ID的颜色,但到目前为止它似乎不起作用。可能存在与video$colour
类相关的任何问题,还是应该以不同的方式分配颜色?
要绘制我在年/月/日文件中划分数据框:
YRMODYlist <- list()
YRMODYlist <- split(video, data.frame(video$yr, video$mo, video$dy))
然后绘图
for (i in 1:length(YRMODYlist)){
colnames(YRMODYlist[[i]]) <-c("id","oldid","yr","mo","dy","lon","lat","col")
plot(YRMODYlist[[i]]$lon, YRMODYlist[[i]]$lat, ylim=c(-90,90),xlim=c(-180,180),col = YRMODYlist[[i]]$col)
}
答案 0 :(得分:2)
1)确保class(video$color)=="character"
将它们转换为您已完成的因素并不是一个好主意。当用作颜色时,这将回退到因子的基础数值而不是您指定的RGB颜色。如果它们是因素,您可以运行
video$colour <-as.character(video$colour)
或者更好,只是
video$colour <- as.factor(cRamp(match(video$id,z)))
所以他们永远不会成为首要因素
2)每次调用plot()
时,图形设备上的内容都会被删除,并创建一个新的图。如果您想要将所有不同的群组添加到彼此之上,请拨打plot()
一次,然后拨打points
以在顶部添加点。如果您想要查看多个不同的绘图,请考虑使用layout()
指定一个网格,其中的绘图将在图形设备上布局。
3)您在样本数据中列出的颜色非常微弱,接近白色。默认的开放绘图角色很薄,你可能根本看不到它们。也许你有太多ids
为每个分配一个独特的可见颜色,或者你需要一个更好的颜色渐变。
最后,如果它不起作用,那么&#34;&#34;非常清楚这是什么。
答案 1 :(得分:2)
查看您的数据,我怀疑这是某种地理位置导向的数据集(因为使用了lon
和lat
变量,这些变量通常用于识别地理位置)世界各地。
假设我是对的,你可以解决这个问题如下:
# reading the data
video <- read.table(header=TRUE, comment.char="",
text="id oldid year month day lon lat colour
01208513 Continent 1885 1 1 -30.7 -32.65 #FFFFFF
04960001 05890280 1885 1 1 122.72 26.17 #FDFEFF
05520001 CornFMort 1885 1 1 -22.84 48.34 #FBFDFF
06058 06058 1885 1 1 -61.5 36.5 #F9FCFF
06251 06251 1885 1 1 -113.5 -2.5 #F7FBFF
06323 06323 1885 1 1 174.5 -26.5 #F5FAFF
06466 06466 1885 1 1 -115.5 -40.5 #F3F9FF
106323 106323 1885 1 1 177.5 -26.5 #F1F8FF")
# getting the required packages
library(ggmap)
library(ggplot2)
# splitting the dataframe into a list of dataframes by id
video$id <- as.factor(video$id)
idlist <- split(video, video$id)
# creating a map for each location with the corresponding points plotted on it
for (i in 1:length(idlist)){
x <- get_map(location = c(lon=mean(idlist[[i]]$lon), lat=mean(idlist[[i]]$lat)), zoom=3, maptype="satellite", scale=2)
p <- ggmap(x) + geom_point(data=idlist[[i]], aes(x=lon, y=lat, fill=as.factor(id)), size = 4, shape = 21, show_guide=FALSE)
print(p)
}
这将产生一系列这样的情节: