【问题标题】:interpolation with matplotlib pcolor使用 matplotlib pcolor 进行插值
【发布时间】:2012-08-18 09:31:01
【问题描述】:

我有两个 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

这会导致外观呈块状,关于如何获得更平滑的图形的任何想法?

【问题讨论】:

    标签: python numpy matplotlib scipy


    【解决方案1】:

    您的深度是否在规则网格上(即恒定间距)?如果是这样,您可以使用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 是要走的路,但我不太能弄清楚如何做到这一点。
    • 我刚刚用一个简单的插值示例更新了我的答案。
    【解决方案2】:

    不,pcolor 不进行插值。您可以尝试NonUniformImage 甚至imshow。查看示例here

    【讨论】:

    • 我想问题不在于我被困在 pcolor 上,因为我不知道如何生成一个会坚持同一轴的图(如果这有意义的话)
    • @pter 如果这次我的理解正确,您想要一个在高深度时拉伸得更多而在低深度时拉伸得更少的色标?
    • 嗯,我不确定这是否是我想要的。在我的 pcolor 图上,上部深度平滑过渡,顶部 1 只是一个像素,它们从那里慢慢变高,因此很容易看到底部深度和第二到底部深度相交的线。我希望我可以添加我的情节图像。
    • @pter 一个情节会有帮助,为什么不呢?
    • @pter 听起来你想拉伸你的轴,为什么不为你的深度做一个对数刻度?
    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2019-04-28
    • 2015-01-21
    • 2015-01-20
    • 2013-04-06
    • 2016-12-18
    相关资源
    最近更新 更多