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

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

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()

导致:

3FrCh.png

如果选择使用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')

您可以获得更干净的情节:

FtDzC.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值,具体取决于最终图像中所需的大小和要放入的值。如果发现计数太大而无法显示,并且如果较小的项目在减小最大尺寸时过小,则可能需要考虑对数刻度而不是强度的线性。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值