给定三个列表中的一些数据,例如:
1
2
3latitudes = [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的坐标为(latitudes[i],longitudes[i])在地图上出现counts[i]次。
我想生成一个具有适当比例的热图。 坐标应由彩色实心圆表示。 圆的直径应以某种方式表示相应坐标的计数。
(作为替代方案,我考虑过用颜色强度来表示计数。我不知道哪种方法最好,或者这两种表现形式是否可以合并。)
我如何实现这样的热图? (我想是这样吗?)
可能有必要提及我正在处理的数据量:
sum(counts)约为1.000.000
大约有25.000个不同的坐标
也许这可能有所帮助-stackoverflow.com/questions/2369492/
scatter是您要寻找的方法,它具有两个可选参数来调整每个尺寸(使用关键字size或仅s)或颜色(使用关键字color或c)点,或者您可以同时进行。颜色或热图效果可能对您拥有的点的密度更好。
这是使用此方法的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import 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()
导致:
如果选择使用size,则可能需要调整计数值,以减少拥挤的情况,例如,通过将上述示例扩展为:
1
2
3
4plt.figure()
COUNT_TO_SIZE = 1./10
plt.scatter(lat, lon, s=counts*COUNT_TO_SIZE)
plt.savefig('scatter_example2.png')
您可以获得更干净的情节:
我当然不小心将纬度和经度从其法线轴调换了,但是您明白了:)
太好了,谢谢!现在,我也尝试缩放地图,因为缩放"计数"还不够。告诉我这是怎么做的好吗?我查找了scatter()方法,但找不到任何参数来实现。我在哪里可以告诉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)使用matplotlib.sourceforge.net/api/ figsize设置一个非常大的数字以英寸为单位的大小,或dpi以控制每英寸的点数。您还可以考虑非线性地缩放计数,也许是通过将大小设置为s=counts*counts*COUNTS_TO_SIZE并调整常数,以使最大的点不会太大...我将尝试提出一个示例并将其添加到答案中...
"缩放"是指将xlim和ylim范围设置为总范围的较小范围,因此在上面的示例中,我将执行plt.xlim(44,46)和plt.ylim(-50, -30)来仅绘制数据的左下角。
再次感谢您提供这些很棒的指示!
我不确定热图,但是要绘制不同大小的彩色圆圈,可以使用:
1
2
3
4from matplotlib import pyplot
pyplot.scatter(longitudes,latitudes,counts,c=rgb)
pyplot.show()
其中rgb是用户定义的rgb值的二维数组,例如:
1
2maxcount = float(max(counts))
rgb = [[ 1, 0.5, x/maxcount ] for x in counts]
或者您希望定义自己的颜色。
在任何图形库的一般答案中,您都想执行以下操作:
1
2
3
4
5maxSize = 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()允许您加入三个列表,并在一个循环中对其进行迭代。
将计数除以最大计数可得到一个相对的尺寸比例,然后将其乘以所需的圆的尺寸即可。如果您也想更改颜色,则可以执行以下操作:
1
2
3
4
5
6maxSize = 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.
随着强度增加,产生从黑色到红色的缩放比例。
您可能需要调整纬度和经度值以产生合理的x和y值,具体取决于最终图像中所需的大小和要放入的值。如果发现计数太大而无法显示,并且如果较小的项目在减小最大尺寸时过小,则可能需要考虑对数刻度而不是强度的线性。
用实际的图形库来实现这一点很简单,但要取决于库本身。