根据列绘制具有不同颜色的data.frame

时间:2014-05-26 18:18:12

标签: r plot

我有一个这样的数据框:

> 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)))

我想要做的事实是每天用lonlat绘制区分不同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)
}

2 个答案:

答案 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)

查看您的数据,我怀疑这是某种地理位置导向的数据集(因为使用了lonlat变量,这些变量通常用于识别地理位置)世界各地。

假设我是对的,你可以解决这个问题如下:

# 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)
}

这将产生一系列这样的情节: enter image description here