Python:如何为具有不同颜色强度或不同圆半径的坐标绘制热图?

Python:如何为具有不同颜色强度或不同圆半径的坐标绘制热图?,python,plot,matplotlib,heatmap,Python,Plot,Matplotlib,Heatmap,给出三个列表中的一些数据,例如: latitudes = [50.877979278564,48.550216674805,47.606079101562,50.772491455078,42.451354980469,43.074657440186,44.044174194336,44.563243865967,52.523406982422,50.772491455078] longitudes = [4.700091838837, 9.038957595825, -122.33300018

给出三个列表中的一些数据,例如:

latitudes = [50.877979278564,48.550216674805,47.606079101562,50.772491455078,42.451354980469,43.074657440186,44.044174194336,44.563243865967,52.523406982422,50.772491455078]
longitudes = [4.700091838837, 9.038957595825, -122.333000183105, 7.190686225891, -76.476554870605, -89.403335571289, -123.070274353027, -123.281730651855, 13.411399841309, 7.190686225891]
counts = [15, 845, 2, 50, 95, 49, 67, 32, 1, 88]
这可以解释为:
i
的坐标(
纬度[i]
经度[i]
)在地图上出现
计数[i]

我想生成一个具有适当比例的热图。堇青石应以彩色圆圈表示。圆的直径应该以某种方式表示相应坐标的计数

(作为一种选择,我考虑用颜色强度来表示计数。我不知道哪种表示最好,或者这两种表示是否可以结合使用。)

我怎样才能实现这样的热图?(我想是这样称呼的吧?

也许提及我正在处理的数据量是相关的:

  • 总和(计数)
    约为1.000.000
  • 大约有25000个不同的坐标

在任何图形库的一般答案中,您都希望执行以下操作:

maxSize = 10 #The maximum radius of the circles you wish to draw.
maxCount = max(counts)

for lat, long, count in zip(latitudes, longitudes, counts):
    draw_circle(lat, long, count/maxCount*maxSize) #Some drawing library, taking x, y, radius.
zip()

将计数除以最大计数可以得到大小的相对比例,然后将其乘以希望圆的大小。如果您也想更改颜色,可以执行以下操作:

maxSize = 10 #The maximum radius of the circles you wish to draw.
maxCount = max(counts)

for lat, long, count in zip(latitudes, longitudes, counts):
    intensity = count/maxCount
    draw_circle(lat, long, intensity*maxSize, Color(intensity*255, 0, 0)) #Some drawing library, taking x, y, radius, colour.
   maxcount = float(max(counts))
   rgb = [[ 1, 0.5, x/maxcount ] for x in counts]
随着强度的增加,产生从黑色到红色的滑动比例

您可能需要调整纬度和经度值以生成正常的x和y值,具体取决于最终图像中所需的大小以及要输入的值。如果你发现你的计数太大而不能显示,并且当降低最大值时,较小的项目太小,你可能需要考虑对数刻度而不是强度的线性。


用实际的图形库实现这一点应该很简单,但这取决于库本身。

我对热图不是很确定,但要使用不同大小的彩色圆圈进行绘图,您可以使用:

   from matplotlib import pyplot    

   pyplot.scatter(longitudes,latitudes,counts,c=rgb)
   pyplot.show()
其中,rgb是用户定义的rgb值的二维数组,类似于:

maxSize = 10 #The maximum radius of the circles you wish to draw.
maxCount = max(counts)

for lat, long, count in zip(latitudes, longitudes, counts):
    intensity = count/maxCount
    draw_circle(lat, long, intensity*maxSize, Color(intensity*255, 0, 0)) #Some drawing library, taking x, y, radius, colour.
   maxcount = float(max(counts))
   rgb = [[ 1, 0.5, x/maxcount ] for x in counts]

或者您希望如何定义您的颜色。

scatter
是您正在寻找的方法,它有两个可选参数,可以调整每个点的大小(使用关键字
size
或只是
s
)或颜色(使用关键字
color
c
),也可以同时进行。颜色或热图效果可能更适合于点的密度

下面是使用此方法的示例:

import matplotlib.pyplot as plt
import numpy as np

NPOINTS = 1000

np.random.seed(101)
lat = np.random.random(NPOINTS)*8+44
lon = np.random.random(NPOINTS)*100-50
counts = np.random.randint(0,1000,NPOINTS)

plt.subplot(211)
plt.scatter(lat, lon, c=counts)
plt.colorbar()
plt.subplot(212)
plt.scatter(lat, lon, s=counts)

plt.savefig('scatter_example.png')
plt.show()
导致:

如果选择使用
大小
,则可能需要调整计数值以获得不太拥挤的绘图,例如,通过扩展上述示例:

plt.figure()
COUNT_TO_SIZE = 1./10
plt.scatter(lat, lon, s=counts*COUNT_TO_SIZE)
plt.savefig('scatter_example2.png')
你可以得到一个更清晰的绘图:


当然,我不小心将纬度和经度与它们的法线轴进行了交换,但您会想到:)

也许这会有所帮助-这很好,谢谢!现在我也在尝试缩放地图,因为缩放“计数”是不够的。能告诉我这是怎么做的吗?我查找了这个方法,但找不到任何参数来实现它。我在哪里可以告诉matplotlib将“贴图”设置得更大,这样点之间的距离就更大了?我很好奇,你所说的“缩放“计数”是什么意思?你是使用计数来设置大小还是颜色?如果使用它来设置颜色,并且生成的圆过于密集,则可以将大小
s
设置为标量:
s=5
。这会将每个点设置为具有相同的大小。默认大小是20,这表示直径的平方,因此s=5是大小一半的圆。对不起,我的英语很差。:-)我会再解释一遍。你在回答中给我看的很好。我知道如何缩放圆圈。我现在想要实现的是使x轴和y轴“更长”。目前我正在探索mathplotlib库,发现:
xmin,xmax=plt.xlim()
。它现在返回-200.0和200.0。如果两个轴都返回-20000.0和20000.0,则轴将更长时间保持比例,从而使圆周围有更多的空间。目前看来,仅仅将纬度和经度换算为100似乎不起作用。:-)有两个选项:(1)使用xlim和ylim“缩放”到一个大陆,为每个大陆制作一个图形,或(2)制作一个非常大的图形使用
figsize
设置以英寸为单位的大小,或
dpi
控制每英寸的点。你也可以考虑非线性的缩放计数,也许是通过将大小设置为<代码> s=计数*计数* CuthsToToSosis并调整常数,以使最大点不太大…我将尝试提出一个例子,并将其添加到答案中。。。