Нанесение тепловой карты морского волка поверх фоновой картинки - PullRequest
0 голосов
/ 30 апреля 2018

Я создаю тепловую карту через морское побережье в Юпитере, чтобы отобразить количество людей, которые выбрали бы определенную точку координат. В настоящее время у меня есть тепловая карта, созданная со следующим кодом

cm = metrics.confusion_matrix(yVals, xVals)
fig, ax = plt.subplots(figsize=(10,10))
sns.heatmap(cm, annot=True, fmt="0.3f", linewidth=0.5, cbar=False,
              cmap="Reds", square=True, ax=ax)
plt.show()

Вот ссылка на изображение, если необходимо, чтобы увидеть, как оно выглядит. Мои вопросы: как я могу нанести эту тепловую карту поверх фонового изображения и сделать квадраты в тепловой карте более прозрачными? чем ближе к 0 они больше показывают фоновое изображение? Также есть ли способ начать индексы на тепловой карте с 1 вместо 0?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 октября 2018
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.image as mpimg 

file = "./iris.csv"
df = pd.read_csv(file)
import seaborn as sns
map_img = mpimg.imread('1538287373.02485_image.png') 
 # Custom it with the same argument as 1D density plot
hmax = sns.kdeplot(df.sepal_width, df.sepal_length, cmap="Reds", shade=True, bw=.15)
hmax.collections[0].set_alpha(0)

plt.imshow(map_img, zorder=0, extent=[0.5, 8.0, 1.0, 7.0])
plt.show()

Output

0 голосов
/ 17 мая 2018

Вам также необходимо масштабировать / переворачивать изображения, чтобы они отображались вместе, потому что карта, вероятно, имеет гораздо более высокое разрешение, чем карта тепла. Мы позволяем Seaborn выполнить настройку, а затем сопоставим его с imshow, который отображает карту

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

Оставлено для читателя: измените отметки, чтобы они ссылались на координаты карты, а не на индексы тепловой карты.

# add alpha (transparency) to a colormap
import matplotlib.cm from matplotlib.colors 
import LinearSegmentedColormap 
wd = matplotlib.cm.winter._segmentdata # only has r,g,b  
wd['alpha'] =  ((0.0, 0.0, 0.3), 
               (0.3, 0.3, 1.0),
               (1.0, 1.0, 1.0))

# modified colormap with changing alpha
al_winter = LinearSegmentedColormap('AlphaWinter', wd) 

# get the map image as an array so we can plot it 
import matplotlib.image as mpimg 
map_img = mpimg.imread('tunis.png') 

# making and plotting heatmap 
import numpy.random as random 
heatmap_data = random.rand(8,9) 

import seaborn as sns; sns.set()

hmax = sns.heatmap(heatmap_data,
            #cmap = al_winter, # this worked but I didn't like it
            cmap = matplotlib.cm.winter,
            alpha = 0.5, # whole heatmap is translucent
            annot = True,
            zorder = 2,
            )

# heatmap uses pcolormesh instead of imshow, so we can't pass through 
# extent as a kwarg, so we can't mmatch the heatmap to the map. Instead, 
# match the map to the heatmap:

hmax.imshow(map_img,
          aspect = hmax.get_aspect(),
          extent = hmax.get_xlim() + hmax.get_ylim(),
          zorder = 1) #put the map under the heatmap

from matplotlib.pyplot import show 
show()

Translucent heatmap plotted over a scaled map

...