Python: Как построить тепловую карту для координат с разной интенсивностью цвета или разным радиусом окружностей? - PullRequest
3 голосов
/ 05 марта 2012

Имеются некоторые данные в трех списках, например:

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, которая (latitudes[i], longitudes[i]) встречается counts[i] разна карте.

Я хочу создать тепловую карту с соответствующим масштабом.Кординаты должны быть представлены цветными кружками.Диаметр кружков должен как-то представлять счет соответствующей координаты.

(В качестве альтернативы я подумал о представлении счетчика по интенсивности цвета. Я не знаю, какой из них лучше или эти два представления могут бытьв сочетании.)

Как я могу реализовать такую ​​тепловую карту?(Я предполагаю, что это так называется?)

Возможно, уместно упомянуть количество данных, с которыми я имею дело:

  • sum(counts) составляет около 1.000.000
  • существует около 25 000 различных координат.

Ответы [ 3 ]

6 голосов
/ 05 марта 2012

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

В результате:

enter image description here

Если вы решите использовать size, вы можете настроить значения счетчика, чтобы получить менее насыщенный график, например, расширив приведенный выше пример с помощью:

plt.figure()
COUNT_TO_SIZE = 1./10
plt.scatter(lat, lon, s=counts*COUNT_TO_SIZE)
plt.savefig('scatter_example2.png')

Вы получаете более чистый участок:

enter image description here

Я, конечно, случайно поменял местами широту и долготу с их обычных осей, но вы поняли:)

0 голосов
/ 05 марта 2012

Я не уверен в тепловой карте, но для построения цветных кругов разных размеров вы можете использовать:

   from matplotlib import pyplot    

   pyplot.scatter(longitudes,latitudes,counts,c=rgb)
   pyplot.show()

где rgb - это двумерный массив пользовательских значений rgb, что-тонапример:

   maxcount = float(max(counts))
   rgb = [[ 1, 0.5, x/maxcount ] for x in counts]

или как вы хотите определить свои цвета.

0 голосов
/ 05 марта 2012

В общем ответе для любой графической библиотеки вы хотели бы сделать что-то вроде этого:

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.

Создание скользящей шкалы от черного к красному по мере увеличения интенсивности.

Возможно, вам придется настроить значения широты и долготы, чтобы получить вменяемые значения x и y, в зависимости от размера, который вы хотите получить в конечном изображении, и значений, которые вы собираетесь вставить. и меньшие элементы слишком малы при уменьшении максимального размера, вы можете рассмотреть логарифмический масштаб вместо линейного для интенсивности.

Реализация этого с реальной графической библиотекой должна быть тривиальной, но зависит от самой библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...