使用matplotlib pcolor进行插值

6
我有两个numpy数组,第一个数组是(30, 365),包含了一年中30个深度的数值。第二个数组是(30, 1),包含了与第一个数组中深度相对应的实际深度(以米为单位)。我想绘制第一个数组,使深度根据第二个数组进行缩放,但我也希望数据被插值处理(前几个深度比较接近,而较低深度则相距较远,这提供了pcolor图像的块状外观)。
这是我的操作:
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 365, 1)
X, Y = np.meshgrid(x, depth)    #depth is the (30, 1) array

plt.pcolor(X, -Y, data)         #data is the (30, 365) array

导致图表呈现方块状的外观,您有什么想法可以让它看起来更加平滑?
2个回答

4

您的深度是否在常规网格上(即间距恒定)?如果是,则可以使用imshow并使用extent关键字设置范围,以及aspect='auto'。否则,您有两个选择。

您可以改用pcolormesh,并使用shading='gouraud'。这将有助于处理尖锐的颜色量化,但不如插值好。

第二个选择是将数据插值到一个新的常规深度网格中,以便您可以使用imshow和不同的插值选项。例如,要仅沿深度方向插值,可以使用scipy的interpolate.interp1d

from scipy.interpolate import interp1d

fint = interp1d(depth, data.T, kind='cubic')
newdata = fint(newdepth).T

添加.T是因为插值必须在数据的最后一个索引上进行,而深度是数据的第一个索引。如果您喜欢,可以将kind替换为'linear'


它不在一个常规网格上。 pcolormesh 有一个有趣的结果,但似乎太模糊了。我认为插值到常规网格然后使用 imshow 是正确的方法,但我还没有完全弄清楚如何做到这一点。 - pter
我刚刚更新了我的答案,并附上了一个简单的插值示例。 - tiago

3
不,pcolor不进行插值。你可以尝试使用NonUniformImage或者imshow代替。在这里查看示例:这里

嗯,我不确定那是否是我想要的。在我的pcolor图中,上部深度平滑过渡,顶部1只有一个像素,然后它们从那里逐渐变高,因此很容易看到底部和次底部深度相遇的线。我希望我能添加我的绘图图像。 - pter
@pter 一张图表会有所帮助,为什么不呢? - nye17
@pter,听起来你想要拉伸你的轴,为什么不对深度使用对数刻度? - nye17
我真的很难弄清楚如何上传这张图片。我需要比例保持不变,否则对数比例肯定可以解决问题。 - pter
@pter,你的图片准备好了吗?如果是的话,在你点击帖子下方的“编辑”按钮后,在编辑框顶部单击图片图标即可。 - nye17
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接