我有3个清单。 x,y和z。我想创建一个等高线图,显示z的强度,在点(x,y)处有一个色标。
之前已经问过并回答了一个非常类似的问题(Python : 2d contour plot from 3 lists : x, y and 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 : 2d contour plot from 3 lists : x, y and rho?中显示的Python脚本,插值点的数量以及原始列表/数组的大小似乎会导致轴消失/无法绘制点的问题。
我不知道导致此错误的原因。非常感谢任何帮助。
答案 0 :(得分:0)
正如已解释的here,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')
结果是:
答案 1 :(得分:0)
作为替代方案,您可能会发现使用这样的三角形图很有意思:
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