Python: Как создать 2D-карту плотности / тепловую карту - PullRequest
2 голосов
/ 11 марта 2020

Я кодирую с python. У меня есть 3 массива x, y и z, и я хотел бы сделать 2d карту плотности значений z в плане (x, y) с цветовой шкалой.

Так что на моем графике цвет в точке x [0] и y [0] будут определяться значением z [0], цвет в точке x [1] и y [1] будет определяться значением z [1], et c.

Кто-нибудь знает, как это сделать?

Спасибо

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Проверьте https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html

Для различных цветовых карт: https://matplotlib.org/tutorials/colors/colormaps.html

Пример кода для вашей потребности будет чем-то как это

 #--------------------------Plotting starts here---------------------------------#

    fig, ax0 = plt.subplots()

    im0 = plt.scatter(x,y,s=1,c=z, cmap='bwr')


#------------------if you want to use pcolormesh-------------------
#----------and have Z values stored as a numpy array Data---------------------#

    #X,Y = np.meshgrid(x,y)
    #im0 = ax0.pcolormesh(X,Y,Data, cmap="YourFavouriteColormap')

    cbar = fig.colorbar(im0,ax=ax0)
    ax0.set_title("Your title")
    plt.xlabel("xlabel")
    plt.ylabel("ylabel")
    filename = "prefix" + "."+ "fileformat"
    plt.savefig(filename)

Редактировать 1: Если в одном из ваших комментариев есть данные сетки, вы можете попробовать pcolorme sh и попробовать затенение, необязательный аргумент для интерполяции.

 shading{'flat', 'gouraud'}, optional

    The fill style, Possible values:

        'flat': A solid color is used for each quad. The color of the quad (i, j), (i+1, j), (i, j+1), (i+1, j+1) is given by C[i, j].
        'gouraud': Each quad will be Gouraud shaded: The color of the corners (i', j') are given by C[i',j']. The color values of the area in between is interpolated from the corner values. When Gouraud shading is used, edgecolors is ignored.
0 голосов
/ 11 марта 2020

В ответ на ваш комментарий AshlinJP: В любом случае, я все равно получил сообщение об ошибке: «imshow () получил несколько значений для аргумента ключевого слова 'cmap'"

Я не знаю, имеет ли это какое-либо значение, но Я использую python 2.7

На самом деле мой код:

import numpy as np
import matplotlib.pyplot as plt


x,y,z = np.loadtxt('gamma.txt', unpack = True)
fig, ax0 = plt.subplots()

cmap = plt.get_cmap('viridis') 
im0 = ax0.imshow(x,y,z, cmap=cmap, interpolation="gaussian")

cbar = fig.colorbar(im0,ax=ax0)


ax0.set_title("Your title")
plt.xlabel("xlabel")
plt.ylabel("ylabel")
0 голосов
/ 11 марта 2020

Вы можете использовать диаграммы разброса matplotlib с легендами и сеткой, где размер каждого круга может быть отнесен к значениям z. Это пример, который я получил от здесь :

volume = np.random.rayleigh(27, size=40)
amount = np.random.poisson(10, size=40)
ranking = np.random.normal(size=40)
price = np.random.uniform(1, 10, size=40)

fig, ax = plt.subplots()

scatter = ax.scatter(volume, amount, c=ranking, s=0.3*(price*3)**2,
                     vmin=-3, vmax=3, cmap="Spectral")

legend1 = ax.legend(*scatter.legend_elements(num=5),
                    loc="upper left", title="Ranking")
ax.add_artist(legend1)

kw = dict(prop="sizes", num=5, color=scatter.cmap(0.7), fmt="$ {x:.2f}",
          func=lambda s: np.sqrt(s/.3)/3)
legend2 = ax.legend(*scatter.legend_elements(**kw),
                    loc="lower right", title="Price")

plt.show()

Вывод:

enter image description here

...