首页 文章

为数据帧制作水平存在的热图

提问于
浏览
-1

我有 dataframe containing 生物学观察 . 对于每个观察,我有 latitude, longitude and species name .

我想做的是 heatmap of the biodiversity/species richness (一个地方不同物种的数量) . 我不想做我观察的热图,但是它的物种多样性 .

我确信这是一种优雅的方式 . 这就是我需要你帮助的原因 .

这是我的数据例子:https://filesender.ens-lyon.fr/?vid=1de55ca8-7e1d-6b29-4a28-00004e605af1

否则我打算:

  • 将 Map 划分为正方形

  • 检查适合正方形的子数据中是否存在级别

  • 将此正方形的种类数添加到数据框中(一种长度(级别(子集(正方形中的数据,lon和lat))))

  • 我的数据帧级别计数的热图我不太喜欢这种方法,因为我的 Map 划分会使我的代码复杂化很多 .

谢谢你的阅读 . 我希望你的眼睛不会因为我的英语而流血 .

阿基姆

1 回答

  • 0

    可能不是最优雅的方式,但它制作了热图 . 我使用了对称断点,但您可以单独调整它们(以及bin宽度) . 您可以使用heatmaps.2来获取自动图例 .

    require(plyr)
    mydf <- read.csv('data_observation.csv')
    #Bin longitude and latitude
    lat_breaks <- seq(-160,175,5)
    long_breaks <- seq(-160,175,5)
    mydf$lat <- cut(mydf$latitude,breaks = lat_breaks, labels=F)
    mydf$long <- cut(mydf$longitude,breaks = long_breaks, labels=F)
    #Aggregate observations 
    mydf <- ddply(mydf, .(lat,long), summarize, div=length(unique(specname)))
    #Build the map
    mymap <- cbind(lat=rep(1:length(lat_breaks), each=length(long_breaks)), 
                   long=rep(1:length(long_breaks), length(lat_breaks)))
    mymap <- merge(mymap,mydf, by=c('lat','long'), all.x=T)
    mymap <-dcast(mymap, lat~long, drop = F,)[,-1]
    #Plot
    heatmap(as.matrix(mymap),Rowv = NA,Colv = NA, scale = 'none', 
            col=topo.colors(256),labRow = lat_breaks, labCol = long_breaks,
            xlab='latitude', ylab='longitude')
    

    enter image description here

相关问题