我正在尝试绘制行密度图。具有挑战性的部分是,每个图必须具有相同的色标最小值和最大值,并且我事先不知道最小值和最大值是多少。我必须首先绘制这些值,以便找出最小值和最大值,删除这些图,然后使用确定的最小值/最大值绘制新的图。
像这样的东西,但是使用 hist2d 并按行(来自另一个 SO 页面的图像):
我提出了一个基于How to have one colorbar for all subplots , vmin and vmax in hist2d 的最小工作示例
以及来自“SpinUp __ A Davis”的解决方案,我不知道如何使用真实数据来实现:
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=1, ncols=3)
for ax in axes.flat: # I don't see how to implement this part with real data
im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)
fig.colorbar(im, ax=axes.ravel().tolist())
plt.show()
但我能想到的最好的办法是这个,这是行不通的:
import matplotlib.pyplot as plt
import numpy as np # only for MWE, not present in real file
# https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist2d.html
# getting min/max
fig, (ax0,ax1) = plt.subplots(nrows = 2, ncols = 1, sharex = True)
colormax = float("-inf")
colormin = float("inf")
h0 = ax0.hist2d(np.random.random(100), np.random.random(100))
colormax = max(h0[0].max(), colormax)
colormin = min(h0[0].min(), colormin)
h1 = ax1.hist2d(np.random.random(200), np.random.random(200))
colormax = max(h1[0].max(), colormax)
colormin = min(h1[0].min(), colormin)
# starting real plot, not just to get min/max
fig, axes = plt.subplots(nrows = 2, ncols = 1, sharex = True, figsize = (6.4,4.8))
i = 0
h = [h0, h1]
for ax in axes.flat: # I don't see how I can implement this
im = ax.imshow(h[i], vmin = colormin, vmax = colormax)
i += 1
fig.colorbar(im, ax= axes.ravel().tolist())
plt.savefig('imshow.debug.png')
要使用以下命令创建直方图
imshow
:ax.hist2d
。所以h0, _, _, _ = ax.hist2d(...)
imshow
需要origin='lower'
在底部具有最低的 y。imshow
需要extent=[...]
x 和 y 范围。由于您似乎希望共享 x 轴(而不是 y 轴),因此需要使用最大 x 范围来计算直方图箱。设置
(np.linspace(xmin, xmax, 11), 10)
将 x 范围分割为 10 个 bin,并使用默认的 10 个 bin 来表示 y。在示例代码中,x 箱是共享的,而 y 箱是特定于每个图的。对相关代码的更改
下面的测试代码也做了一些修改:
turbo
颜色图和额外的颜色条可以更好地看到差异for
(列表理解来计算最小值和最大值)使用
np.histogram2d()
为了简化代码,可以使用
ax.hist2d
,来代替 。np.histogram2d
这将完成所有计算,而无需创建绘图。