我有一个大型代码,可以从预定义的z
网格中生成一些x,y
数据。
生成z
数据后(已生成一些z
数据的文件可用here)我将其插入更精细的网格(使用scipy.interpolate)。最后,我在这个更精细的网格中获得了最大z_max
值。
问题是我使用y_max
和np.unravel_index()
获得的np.argmax()
坐标值与我在最终图片中看到的值不同。
使用下面的MWE,我得到x_max, y_max
值的z_max
坐标为:
40.5778894472 192.462311558
根据下图所示,x_max
值似乎是正确的。但是图中曲线所包含的y_max
值的z_max
坐标显然不是~192.5
。它更接近210
。
我在这里做错了什么?
输出图片
MWE
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import scipy.interpolate
def get_z_data(x, y):
# Instead of generating the data, read them from a file that contains
# the z data already generated. This is much faster and simpler.
# Values passed are thus just for showing how the MWE works, and are
# not actually used.
z = []
with open('data.dat') as f:
for l in f:
z.append(float(l))
return np.asarray(z)
# These values are used to generate the z data.
N = 25 # Grid size: N x N
x, y = np.linspace(20., 65., N), np.linspace(100., 300., N)
# Generate z data.
z = get_z_data(x, y)
# Define interpolating function.
z = z.reshape(N, N)
rbs = scipy.interpolate.RectBivariateSpline(x, y, z)
# Define a finer grid to interpolate on.
xi, yi = np.linspace(20., 65., 200), np.linspace(100., 300., 200)
# Get values on grid.
zi = rbs(xi, yi)
# x_max, y_max, z_max values.
max_idx = np.unravel_index(zi.argmax(), zi.shape)
print xi[max_idx[0]], yi[max_idx[1]], zi.max()
# Plot
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111)
plt.imshow(np.rot90(zi), vmin=zi.min(), vmax=zi.max(), origin='lower',
extent=[xi.min(), xi.max(), yi.min(), yi.max()],
cmap=cm.get_cmap('RdBu_r'))
plt.contour(xi, yi, np.rot90(zi), 200, colors='k', linewidths=0.2)
ax.set_aspect(aspect='auto')
fig.tight_layout()
plt.savefig('out_fig.png', dpi=150)
答案 0 :(得分:0)
你也可以使用:
plt.imshow(zi.transpose(), origin = 'bottom')
答案 1 :(得分:0)
回答我自己的问题,因为它比写一篇长篇评论更清楚。
问题是:
origin
需要upper
中的plt.imshow
。origin
和extent
添加到plt.contour
xi, yi
中删除plt.contour
值,因为the docs中说明了这一点:如果在调用时指定了X和Y,则此关键字[origin]无效轮廓“。这两行代码应该如下所示:
plt.imshow(np.rot90(zi), vmin=zi.min(), vmax=zi.max(), origin='upper', extent=[xi.min(), xi.max(), yi.min(), yi.max()], cmap=cm.get_cmap('RdBu_r'))
plt.contour(np.rot90(zi), 200, colors='k', linewidths=0.2, origin='upper', extent=[xi.min(), xi.max(), yi.min(), yi.max()])