0

我一直在努力让它像我想要的那样工作,但我似乎无法以正确的方式得到它。问题如下,我有一些由 x, y 的函数生成的 2D 数据,我试图在 pylab.figure 上显示这些数据。

输入数据如下所示:

range1_labels = [0.002, 0.006, 0.010, 0.014, 0.018]
range2_labels = [10, 25, 80]
data_values = 2d array with dimensions (len(x_values), len(y_values))

从这个使用 scipy 的 RectBivariateSpline 我生成 600 x 600 的值,我现在想在 pylab.figure 上显示这个生成的数据,但在这些间隔中有 x 和 y 轴标签的值。到目前为止所做的尝试:

    axes = figure.gca()
    img = axes.matshow(posteriori_data)
    axes.set_title("Interpolated values") 
    figure.colorbar(img)

    axes.set_yticks(range(len(range2_labels)), range2_labels)
    axes.set_xticks(range(len(range1_labels)), range1_labels)

这种尝试仍然给我两个轴的标签 [0, 100, 200, 300, 400, 500]。

我尝试的另一件事是:

    axes = figure.gca()
    img = axes.matshow(posteriori_data, extent=(min(range1_labels), max(range1_labels),
                                                min(range2_labels), max(range2_labels)),
                       aspect='auto')
    axes.set_title("Interpolated values") 
    figure.colorbar(img)

这似乎更接近我想要的。对于“较大”轴,标签会正确生成,即使在缩放时也会正确重新计算。因此,在上面的示例中,range2 的标签按预期显示,但没有为 range1 生成标签。

任何指针?

问候

4

1 回答 1

1

您的问题是您的范围太小,并且刻度定位器无法优雅地处理这个问题。

就像是:

data = rand(600,600)
extent = [.002, .018, 10, 80]

ax = gca()
ax.matshow(data, extent=extent, aspect='auto')
ax.get_xaxis().set_major_locator(matplotlib.ticker.LinearLocator(5))

plt.draw()

会做你想做的。

深入研究一下,似乎正在发生的事情,您正在使用matshow它是一个为显示矩阵而调整的函数。它设置的定位器是MaxNLocator一个标志integer,它强制它只在整数值(doc)上放置刻度。如果您正在绘制矩阵,这是有道理的。在您的情况下,您将范围设置为小于 1,因此您不会得到刻度。

另一种解决方案是使用imshow

data = rand(600,600)
extent = [.002, .018, 10, 80]

ax = gca()
ax.imshow(data, extent=extent, aspect='auto', interpolation='nearest')

plt.draw()

这就是matshow实际上所做的(src),您可以复制要从该实现中保留的功能,并删除您不想要的功能。

于 2013-04-19T14:58:50.917 回答