从np.argmax()到图的密度图中的最大值之间的差异

时间:2015-11-27 02:24:49

标签: python numpy scipy interpolation

我有一个大型代码,可以从预定义的z网格中生成一些x,y数据。

生成z数据后(已生成一些z数据的文件可用here)我将其插入更精细的网格(使用scipy.interpolate)。最后,我在这个更精细的网格中获得了最大z_max值。

问题是我使用y_maxnp.unravel_index()获得的np.argmax()坐标值与我在最终图片中看到的值不同。

使用下面的MWE,我得到x_max, y_max值的z_max坐标为:

40.5778894472 192.462311558 

根据下图所示,x_max值似乎是正确的。但是图中曲线所包含的y_max值的z_max坐标显然不是~192.5。它更接近210

我在这里做错了什么?

输出图片

enter image description here

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)

2 个答案:

答案 0 :(得分:0)

你也可以使用:

plt.imshow(zi.transpose(), origin = 'bottom')

答案 1 :(得分:0)

回答我自己的问题,因为它比写一篇长篇评论更清楚。

问题是:

  1. origin需要upper中的plt.imshow
  2. 需要将同一originextent添加到plt.contour
  3. 需要从xi, yi中删除plt.contour值,因为the docs中说明了这一点:如果在调用时指定了X和Y,则此关键字[origin]无效轮廓“。
  4. 这两行代码应该如下所示:

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