Подтвердить что ты не робот

Как построить карту плотности в python?

У меня есть .txt файл, содержащий значения x, y регулярно расположенных точек в 2D-карте, а третья координата - плотность в этой точке.

4.882812500000000E-004  4.882812500000000E-004  0.9072267
1.464843750000000E-003  4.882812500000000E-004   1.405174
2.441406250000000E-003  4.882812500000000E-004   24.32851
3.417968750000000E-003  4.882812500000000E-004   101.4136
4.394531250000000E-003  4.882812500000000E-004   199.1388
5.371093750000000E-003  4.882812500000000E-004   1278.898
6.347656250000000E-003  4.882812500000000E-004   1636.955
7.324218750000000E-003  4.882812500000000E-004   1504.590
8.300781250000000E-003  4.882812500000000E-004   814.6337
9.277343750000000E-003  4.882812500000000E-004   273.8610

Когда я рисую эту карту плотности в gnuplot со следующими командами:

set palette rgbformulae 34,35,0
set size square
set pm3d map
splot "dens_map.map" u 1:2:(log10($3+10.)) title "Density map"`

Который дает мне это прекрасное изображение:

enter image description here

Теперь я хотел бы получить тот же результат с matplotlib.

4b9b3361

Ответ 1

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

import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import LogNorm
import numpy as np
x, y, z = np.loadtxt('data.txt', unpack=True)
N = int(len(z)**.5)
z = z.reshape(N, N)
plt.imshow(z+10, extent=(np.amin(x), np.amax(x), np.amin(y), np.amax(y)),
        cmap=cm.hot, norm=LogNorm())
plt.colorbar()
plt.show()

Я предполагаю, что ваши данные могут быть преобразованы в массив 2d простым преобразованием. Если это не так, вам нужно немного усложнить получение данных в этой форме. Использование imshow и не pcolormesh здесь более эффективно, если данные лежат на сетке (как кажется). Вышеприведенный фрагмент кода приводит к следующему изображению, которое приближается к тому, что вы хотели:

Resulting image

Ответ 2

Комментарий от @HYRY хорош, но лучший минимальный рабочий ответ (с рисунком!) лучше. Использование plt.pcolormesh

import pylab as plt
import numpy as np

# Sample data
side = np.linspace(-2,2,15)
X,Y = np.meshgrid(side,side)
Z = np.exp(-((X-1)**2+Y**2))

# Plot the density map using nearest-neighbor interpolation
plt.pcolormesh(X,Y,Z)
plt.show()

enter image description here

Если данные выглядят как ваш образец, numpy может загрузить его с помощью команды numpy.genfromtext.