2D-график matplotlib по значениям x, y, z

Я новичок в Python.

У меня есть список значений X

x_list = [-1,2,10,3]

и у меня есть список значений Y

y_list = [3,-3,4,7]

Затем у меня есть значение Z для каждой пары. Схематично это работает так:

X   Y    Z
-1  3    5
2   -3   1
10  4    2.5
3   7    4.5

а значения Z хранятся в z_list = [5,1,2.5,4.5]. Мне нужно получить 2D-график со значениями X на оси X, значениями Y на оси Y и для каждой пары значением Z, представленным картой интенсивности. Это то, что я пробовал, безуспешно:

X, Y = np.meshgrid(x_list, y_list) 
fig, ax = plt.subplots()
extent = [x_list.min(), x_list.max(), y_list.min(), y_list.max()]
im=plt.imshow(z_list, extent=extent, aspect = 'auto')
plt.colorbar(im)
plt.show()

Как это сделать правильно?


person johnhenry    schedule 27.09.2016    source источник


Ответы (2)


Проблема в том, что imshow(z_list, ...) будет ожидать, что z_list будет массивом типа (n,m), в основном сеткой значений. Чтобы использовать функцию imshow, вам нужно иметь значения Z для каждой точки сетки, что вы можете сделать, собрав больше данных или интерполируя.

Вот пример использования ваших данных с линейной интерполяцией:

from scipy.interpolate import interp2d

# f will be a function with two arguments (x and y coordinates),
# but those can be array_like structures too, in which case the
# result will be a matrix representing the values in the grid 
# specified by those arguments
f = interp2d(x_list,y_list,z_list,kind="linear")

x_coords = np.arange(min(x_list),max(x_list)+1)
y_coords = np.arange(min(y_list),max(y_list)+1)
Z = f(x_coords,y_coords)

fig = plt.imshow(Z,
           extent=[min(x_list),max(x_list),min(y_list),max(y_list)],
           origin="lower")

# Show the positions of the sample points, just to have some reference
fig.axes.set_autoscale_on(False)
plt.scatter(x_list,y_list,400,facecolors='none')

введите описание изображения здесь

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

person Albert P    schedule 27.09.2016

Вот один из способов сделать это:

import matplotlib.pyplot as plt
import nupmy as np
from matplotlib.colors import LogNorm

x_list = np.array([-1,2,10,3])
y_list = np.array([3,-3,4,7])
z_list = np.array([5,1,2.5,4.5])

N = int(len(z_list)**.5)
z = z_list.reshape(N, N)
plt.imshow(z, extent=(np.amin(x_list), np.amax(x_list), np.amin(y_list), np.amax(y_list)), norm=LogNorm(), aspect = 'auto')
plt.colorbar()
plt.show()

введите здесь описание изображения

Я перешел по этой ссылке: Как построить карту плотности в python?

person Abhijay Ghildyal    schedule 27.09.2016