【问题标题】:Plot 2D histogram data with pcolormesh使用 pcolormesh 绘制二维直方图数据
【发布时间】:2017-11-21 09:58:41
【问题描述】:

我需要绘制一个分类统计数据,就像从scipy.stats.binned_statistic_2d 得到的那样。基本上,这意味着我有边缘值和 bin 内数据。这也意味着我不能(据我所知)使用plt.hist2d。这是一个代码 sn-p 来生成我可能需要绘制的那种数据:

import numpy as np
x_edges = np.arange(6)
y_edges = np.arange(6)
bin_values = np.random.randn(5, 5)

可以想象我可以为此使用pcolormesh,但问题是pcolormesh 不允许bin 边缘值。以下将仅绘制 bin 1 到 4 中的值。第 5 个值被排除在外,因为虽然 pcolormesh “知道” 4.0 处的值是某个值,但没有稍后要绘制的值,因此第 5 个 bin 的宽度为零。

import matplotlib.pyplot as plt

X, Y = np.broadcast_arrays(x_edges[:5, None], y_edges[None, :5])

plt.figure()
plt.pcolormesh(X, Y, bin_values)
plt.show()

可以通过添加一组与最后一个值相等的附加值来解决这个问题:

import matplotlib.pyplot as plt

X, Y = np.broadcast_arrays(x_edges[:, None], y_edges[None, :])
dummy_bin_values = np.zeros([6, 6])
dummy_bin_values[:5, :5] = bin_values
dummy_bin_values[5, :] = dummy_bin_values[4, :]
dummy_bin_values[:, 5] = dummy_bin_values[:, 4]

plt.figure()
plt.pcolormesh(X, Y, dummy_bin_values)
plt.show()

然而,这一个丑陋的黑客。有没有更简洁的方法来绘制带有 bin 边缘值的 2D 直方图数据? “不”可能是正确的答案,但如果是的话,请说服我。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    我不明白这两个选项中的任何一个的问题。所以这里只是一个代码,它使用了带有 pcolormesh 的 numpy 直方图数据,以及简单的 plt.hist2d

    import numpy as np
    import matplotlib.pyplot as plt
    
    x_edges = np.arange(6)
    y_edges = np.arange(6)
    data = np.random.rand(340,2)*5
    
    ### using numpy.histogram2d
    bin_values,_,__ = np.histogram2d(data[:,0],data[:,1],bins=(x_edges, y_edges) )
    X, Y = np.meshgrid(x_edges,y_edges)
    
    fig, (ax,ax2) = plt.subplots(ncols=2)
    ax.set_title("numpy.histogram2d \n + plt.pcolormesh")
    ax.pcolormesh(X, Y, bin_values.T)
    
    ### using plt.hist2d
    ax2.set_title("plt.hist2d")
    ax2.hist2d(data[:,0],data[:,1],bins=(x_edges, y_edges))
    
    
    plt.show()
    

    当然,这同样适用于scipy.stats.binned_statistic_2d

    【讨论】:

    • 你是对的。我误解的核心是没有意识到您可以将 X 和 Y 传递给长度比 Z 大 1 的 pcolormesh。
    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 2012-10-20
    • 1970-01-01
    • 2020-03-12
    • 2023-04-06
    • 2012-09-01
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多