如何制作动态地理热图?
我有一组坐标和时间戳,这些数据分布在24小时内。我想制作一个动态热力图,展示一天中的情况。
我试着查看了Basemap的示例库,但是代码对我来说有点复杂,连一个基本的热力图都搞不定。我特别不明白的是contourf()
这个函数里的data
参数。
我该怎么做呢?
附:示例数据:
[{'date': datetime.datetime(2013, 3, 12, 6, 13, 0), 'loc': (46.448269, 16.363296)},
{'date': datetime.datetime(2013, 3, 12, 6, 13, 1), 'loc': (37.702152, -120.127964)},
{'date': datetime.datetime(2013, 3, 12, 6, 13, 1), 'loc': (14.484318, 121.037639)},
...]
2 个回答
根据文档的建议,试着看看 matplotlib.pyplot.contourf
的说明,了解一下数据参数的具体内容。代码看起来很复杂,其实是因为它在从网上加载地理数据,并且绘制了大陆、海洋和经纬线。
我对 Basemap 的使用有点生疏,但页面上的核心功能调用(根据示例)是:
# create the map, i.e. the plot surface as a map projection given
# the type of projection you need and the point you want as center of the map
map = Basemap(projection='ortho', lat_0=45, lon_0=-100, resolution='l')
# draw the continents lines
map.drawcountries(linewidth=0.25)
# draw the contour plot
cs = map.contour(x, y, data, 15, linewidths=1.5)
我想这也没什么比这更简单的了。如果你需要更详细的解决方案,请分享一下你的问题细节、你拥有的数据结构以及你尝试过的一些代码。
data
是你想要用来绘制轮廓的数据。绘制轮廓时,你需要把一个值 z
和地图上的每一个 (x, y) 点关联起来。这里的 data
就是这个 z 值。举个例子,如果你想做一个温度的轮廓图,data
就是温度的数值。
根据你提供的样本数据,我不太明白你想要绘制什么。你有时间戳和地点,但没有和这些值关联的数据。仅仅用这些信息来绘制轮廓图是没有意义的(除非每个地点只有一个时间戳,并且你想绘制一个静态的地图,把时间作为 z 值)。你不能仅仅说“想要一个全天候的动态轮廓图”,你需要有一个动态轮廓图 表示某种东西(也就是说,表示其他的数量)在一天中的变化。你希望地图上显示的值代表什么?你的因变量是什么?
如果你想要的变量是“这些坐标上的数据点数量”,那么你应该先计算这个数量。也就是说,把你的数据按坐标和时间分组,统计每个地点/时间的数据点数量。你想要的结果类似于下面的表格:
X Y Time Points
-10 2 10:30 4
-10 2 11:00 10
4 -10 10:30 6
4 -10 11:00 8
然后你可以生成一系列的轮廓图,其中 data
变量取自“Points”这一列。我建议你看看 pandas 库,它提供了方便的数据切片和聚合方法(例如,可以按坐标和/或时间分组)。
另外一种可能性是使用 这里 描述的技术。