使用ggplot中的geom_tile绘制连续数据的强度图

4

我正在尝试在空间中绘制一个连续变量。我看到了一个例子,得到了我所需要的相同结果:

library("MASS")
library("ggplot2")
library(reshape2) 

DB<-melt(volcano)
ggplot(DB, aes(x=Var1, y=Var2, fill=value)) +geom_tile()

图片描述

所以我对我的数据做了如下处理:

library(repmis)
url<-"https://www.dropbox.com/s/4m5qk32wjgrjq40/dato.RDATA"
source_data(url)

library(ggplot2)
ggplot(dato,aes(y=variable,x=y,fill=value))+geom_tile()

enter image description here

很不错。但我的“x”和“y”是距离空间中某一点的千米数(东和北方向)。我将它们转换为纬度和经度。但现在我的绘图无法正常工作!

ggplot(dato,aes(y=lat,x=long,fill=value))+geom_tile()

图片描述

我不明白为什么。无论如何,将我的数据绘制成点的形式,结果非常相似:

ggplot(dato,aes(y=lat,x=long,fill=value))+geom_point()
ggplot(dato,aes(y=variable,x=y,fill=value))+geom_point()

可能相关:http://docs.ggplot2.org/0.9.3.1/scale_gradient.html, http://docs.ggplot2.org/0.9.2.1/scale_gradient2.html - CinchBlue
1
我认为这是因为纬度和经度点没有均匀间隔,因此不能形成网格。如果距离均匀分布,则坐标不能均匀分布,反之亦然。如果绘制纬度和经度点,您会发现它们略微倾斜。您可能需要进行一些插值才能使其正常工作。 - maccruiskeen
我觉得插值有点复杂。除了geom_tile以外,是否有其他方法可以得到相同的结果? - dax90
抱歉,我现在才看到这个评论,但看起来你已经得到了一个很好的解决方案 :) - maccruiskeen
1个回答

14

你可以有所作弊,使用带有正方形形状的 geom_point

#devtools::install_github("sjmgarnier/viridis")
library(viridis)
library(ggplot2)
library(ggthemes)
library(scales)
library(grid)

gg <- ggplot(dato)
gg <- gg + geom_point(aes(x=long, y=lat, color=value), shape=15, size=5)
gg <- gg + coord_equal()
gg <- gg + scale_color_viridis(na.value="#FFFFFF00")
gg <- gg + theme_map()
gg <- gg + theme(legend.position="right")
gg

enter image description here

我没有投影lat/long对,只是使用了coord_equal。你应该为被绘制区域使用适当的投影方式。

而且,现在你引起了我对米兰周围的那些热点地区的好奇心 :-)

gmap <- get_map(location=c(9.051062, 45.38804, 9.277473, 45.53438),
                 source="stamen", maptype="toner", crop=TRUE)
gg <- ggmap(gmap)
gg <- gg + geom_point(data=dato, aes(x=long, y=lat, color=value), shape=15, size=5, alpha=0.25)
gg <- gg + coord_map()
gg <- gg + scale_color_viridis(na.value="#FFFFFF00")
gg <- gg + theme_map()
gg <- gg + theme(legend.position="right")
gg

输入图片描述


真的很鼓舞人心。你让我的一天变得更美好了。 - paoloeusebi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接