2

我有 3 个列表。x、y 和 z。我想创建一个等高线图,显示 z 的强度,并在点 (x,y) 处使用色标。

之前已经提出并回答了一个与此非常相似的问题(Python:来自 3 个列表的 2d 等高线图:x、y 和 rho?),但我遇到了 x 和 y 轴不显示的问题。

我的脚本:

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate

x =  [428, 598, 482, 351, 508, 413, 417, 471, 287, 578]
y =  [17449761, 19201380, 19766087, 18535270, 21441241, 20863875, 18686389, 17776179, 16372016, 20170943]
n =  [1.4406303782314329, 1.3248722314086339, 1.4064635429655712, 2.8806478042859767, 1.4067238073230157, 1.6444745940954972, 1.5180461138137205, 1.3819609357508074, 25.370740891787577, 1.3420941843768535]

# convert to arrays to make use of previous answer to similar question
x = np.asarray(x)
y = np.asarray(y)
z = np.asarray(n)
print "x = ", x
print "y = ", y
print "z = ", z

# Set up a regular grid of interpolation points
nInterp = 200
xi, yi = np.linspace(x.min(), x.max(), nInterp), np.linspace(y.min(), y.max(), nInterp)
xi, yi = np.meshgrid(xi, yi)

# Interpolate; there's also method='cubic' for 2-D data such as here
#rbf = scipy.interpolate.Rbf(x, y, z, function='linear')
#zi = rbf(xi, yi)
zi = scipy.interpolate.griddata((x, y), z, (xi, yi), method='linear')


plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin='lower',
           extent=[x.min(), x.max(), y.min(), y.max()])

plt.xlabel("X")
plt.ylabel("Y")        
plt.colorbar()
plt.show()

这会生成以下图:

故障图

我玩过 Python 中显示的 Python 脚本:来自 3 个列表的 2d 等高线图:x、y 和 rho?并且插值点的数量以及原始列表/数组的大小似乎会导致轴消失/无法绘制点的问题。

我不知道是什么导致了这个错误。任何帮助深表感谢。

4

2 回答 2

1

作为替代方案,您可能会发现像这样使用三等高线图很有趣:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.tri as mtri

x =  [428, 598, 482, 351, 508, 413, 417, 471, 287, 578]
y =  [17449761, 19201380, 19766087, 18535270, 21441241, 20863875, 18686389, 17776179, 16372016, 20170943]
z =  [1.4406303782314329, 1.3248722314086339, 1.4064635429655712, 2.8806478042859767, 1.4067238073230157, 1.6444745940954972, 1.5180461138137205, 1.3819609357508074, 25.370740891787577, 1.3420941843768535]

x = np.asarray(x)
y = np.asarray(y)
z = np.asarray(z)

triang = mtri.Triangulation(x, y)
plt.triplot(triang)
plt.tricontourf(triang, z, vmin=z.min(), vmax=z.max(), origin='lower',
       extent=[x.min(), x.max(), y.min(), y.max()])

plt.xlabel("X")
plt.ylabel("Y")        
plt.colorbar()
plt.show()

三角轮廓

另请参阅 tri 模块中的示例:http: //matplotlib.org/api/tri_api.html

于 2013-09-19T18:58:33.180 回答
1

正如这里所解释的,imshow默认情况下使用的纵横比为1. 在您的情况下,这会导致情节严重缩放。包括一个调整纵横比的语句imshow- 例如aspect='auto'- 你会得到你期望的情节。

plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin='lower',
       extent=[x.min(), x.max(), y.min(), y.max()], aspect='auto') 

结果是:

在此处输入图像描述

于 2013-09-19T14:47:36.313 回答