制作数据框级别存在的热图
Make heatmap of presence of levels for a dataframe
我有一个 包含 生物学观察的数据框。对于每个观察结果,我有 纬度、经度和物种名称。
我想要做的是 biodiversity/species 丰富度 (一个位置不同物种的数量)的热图。我不想做我的观察的热图,而是其中的物种多样性。
我确信它存在一种优雅的方式来做到这一点。这就是为什么我需要你的帮助。
这是我的数据示例:https://filesender.ens-lyon.fr/?vid=1de55ca8-7e1d-6b29-4a28-00004e605af1
否则我打算:
- 将地图分成正方形
- 检查适合正方形的子集数据中是否存在水平
- 将这个正方形的物种数量添加到一个数据框中(一种length(levels(subset(data,lon and lat in the square))))
- 我的水平计数数据框的热图图
我不太喜欢这种方法,因为我的地图划分会使我的代码复杂化很多。
感谢您的阅读。希望你们不要因为我的英语而流泪
阿基姆
可能不是最优雅的方式,但它可以制作热图。我使用对称中断,但您可以单独调整它们(以及 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')
我有一个 包含 生物学观察的数据框。对于每个观察结果,我有 纬度、经度和物种名称。
我想要做的是 biodiversity/species 丰富度 (一个位置不同物种的数量)的热图。我不想做我的观察的热图,而是其中的物种多样性。
我确信它存在一种优雅的方式来做到这一点。这就是为什么我需要你的帮助。
这是我的数据示例:https://filesender.ens-lyon.fr/?vid=1de55ca8-7e1d-6b29-4a28-00004e605af1
否则我打算:
- 将地图分成正方形
- 检查适合正方形的子集数据中是否存在水平
- 将这个正方形的物种数量添加到一个数据框中(一种length(levels(subset(data,lon and lat in the square))))
- 我的水平计数数据框的热图图 我不太喜欢这种方法,因为我的地图划分会使我的代码复杂化很多。
感谢您的阅读。希望你们不要因为我的英语而流泪
阿基姆
可能不是最优雅的方式,但它可以制作热图。我使用对称中断,但您可以单独调整它们(以及 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')