Basemap热力图错误/地图空白

6

我试图在指定的地理位置上绘制散点热力图。我可以很好地绘制没有背景的普通散点图,但是我想将其与给定的纬度和经度结合起来。 我得到了下面这张空白的地图enter image description here

输入

输入:col[2]col[3]xy 坐标 & 地理位置 纬度:19.997453,经度:73.789802

000000000023 61.0 19.006113 73.009168 
000000000054 65.0 19.009249 73.000342 
000000000003 19.0 19.001051 73.000080 
000000000012 20.0 19.009390 73.008638 
000000000061 82.0 19.008550 73.003605 
000000000048 86.0 19.006597 73.001057 
00000000005d 60.0 19.003857 73.009618 
000000000006 60.0 19.003370 73.009112 
000000000037 91.0 19.002558 73.000546 
000000000047 32.0 19.006061 73.008239 

程序

from matplotlib import pyplot as plt 
from matplotlib import cm as CM
from matplotlib import mlab as ml
from mpl_toolkits.basemap import Basemap
import numpy as np 

m = Basemap(width=12000000, height=9000000, projection='lcc', 
            resolution='c', lat_0=19.,lon_0=73.)
m.drawcoastlines(linewidth=0.25)

data = np.loadtxt('random_lat_lon_0', unpack=True, 
                  dtype='str, float, float, float')

x  = data[2]
y  = data[3]
z  = data[1]

gridsize = 100 
m.hexbin(x, y, C=z, gridsize=gridsize)

cb = m.colorbar()
#m.set_label('Density')
plt.show()  

没有报错,但我只看到空白地图,没有散点图数据。
如何解决?谢谢!

3
Matplotlib在 m.imshow(data, interpolation = 'none') 处报错。data 数组形状为 (N, 6),无法解释为图像。您需要提供一个像 (N, M, 3) 这样的像素值网格给 imshow,其中最后一个维度表示RGB值。 - wflynny
3
看起来你已经试图绘制这个图表几周了... 1, 2, 3 - wflynny
1
你有关于地理位置的任何图像数据吗? - wflynny
2
@wflynny 是的,我已经试图绘制太多地图了,每个地图都有不同的目的,但问题似乎相似。 - user3964336
1
我有点困惑... 图像数据? - user3964336
显示剩余3条评论
1个回答

2
我现在明白了。您想要将从这里-imshow这里-hexbin收到的答案结合起来。
您的问题归结为您想要使用Basemap作为绘制2D直方图的"画布"。但是,您没有这样做,而是先创建一个Basemap,然后单独绘制2D直方图(使用plt.hexbin从Basemap中创建一个单独的画布)。
请使用m.hexbin并摆脱plt.imshow()。如果您真的想使用imshow,则需要首先创建一个单独的2D直方图数组,然后使用imshow绘制它。下面是我如何使用hexbin进行操作的方式。

编辑:下面我随机生成了一些x、y、z数据,以便可以绘制出图表(并使海岸线更大)。虽然不完美,但它显示了绘制的数据。

from matplotlib import pyplot as plt 
from matplotlib import cm as CM
from matplotlib import mlab as ml
from mpl_toolkits.basemap import Basemap
import numpy as np 

m = Basemap(width=12000000, height=9000000, projection='lcc', 
            resolution='c', lat_0=19.,lon_0=73.)
m.drawcoastlines(linewidth=0.25) # I added color='red', lw=2.0

#data = np.loadtxt('inputfile', unpack=True, 
                  dtype='str, int, int, int, int, float')
#
#x  = data[1]
#y  = data[2]
#z  = data[5]
x, y, z = np.random.rand(3, 1000000)
x *= 12e6
y *= 9e6
z *= 20000

gridsize = 100 
m.hexbin(x, y, C=z, gridsize=gridsize, cmap=plt.cm.YlGnBu)

cb = m.colorbar()
m.set_label('Density')
plt.show()

enter image description here


没错,非常感谢。它们看起来是小错误,但会造成很大的影响。现在正在尝试上述代码。 - user3964336
1
我得到了一个空地图 :( 将尝试自己的方法来完整解决方案..非常感谢您提供的解决方案。可能是因为col[1]col[2]不是我为basemap提供的确切latlong - user3964336
1
@SitzBlogz 如果你看一下底图的大小,然后再看一下六边形网格的范围,它们差别非常大。你的六边形网格可能已经显示出来了,但只是作为底图左下角的一个极小网格(在东非的某个地方?)。 - wflynny
我使用给定的纬度和经度范围生成了一些随机数据,但仍然得到了空地图。我也尝试减小和增加宽度和高度,但结果都是一样的。 - user3964336
这仅适用于随机数据,但当从包含相同纬度和经度范围的文件中读取时,它仍然显示空地图。 - user3964336
1
@SitzBlogz,这听起来像是你的数据文件有问题或者是你读取/存储/解析数据的方式有问题,而不是绘图问题。也许你的网格太稀疏了。无论如何,最好提出一个新问题,展示你更新后的代码、输入文件的样本以及x、y和z的总形状/大小。在这里链接到新问题。 - wflynny

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