2016-09-27 138 views
2

我是一個Python初學者。matplotlib x,y,z值的2D圖

我有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]。 我需要用X軸上的X值,Y軸上的Y值以及每個對中的Z值(用強度圖表示)獲得2D圖。 這是我曾經嘗試過,失敗:

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

如何得到這個正確呢?

回答

1

這裏是做這件事的一種方法:

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

enter image description here

我跟着這個鏈接:How to plot a density map in python?

1

的問題是,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') 

enter image description here

你可以看到,它在您的採樣點(由x_listy_list,通過示出指定顯示正確的值半圓),但由於插值的性質和少量的採樣點,它在其他地方的變化要大得多。

相關問題