使用matplotlib创建log-linear图表,使用hist2d。

11

我想知道是否可以这样做。我已经尝试使用numpy logspace显式设置bin,还尝试将xscale设置为“log”。但这两个选项都无效。有人试过吗?

我只需要一个X轴为对数坐标轴,Y轴为线性坐标轴的二维直方图。


请分享你的代码。 - Drazisil
1个回答

19

它不能正常工作的原因是因为plt.hist2d使用了pcolorfast方法,这对于大图像来说更加高效,但不支持对数坐标轴。

要在对数坐标轴上正确生成2D直方图,您需要使用np.histogram2dax.pcolor自己创建。然而,只需要额外添加一行代码。

首先,让我们在线性轴上使用指数间隔的条形图:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.random((2, 1000))
x = 10**x

xbins = 10**np.linspace(0, 1, 10)
ybins = np.linspace(0, 1, 10)

fig, ax = plt.subplots()
ax.hist2d(x, y, bins=(xbins, ybins))

plt.show()

这里输入图片描述

好的,一切都很好。现在让我们看看如果我们将x轴使用对数刻度会发生什么:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.random((2, 1000))
x = 10**x

xbins = 10**np.linspace(0, 1, 10)
ybins = np.linspace(0, 1, 10)

fig, ax = plt.subplots()
ax.hist2d(x, y, bins=(xbins, ybins))

ax.set_xscale('log') # <-- Only difference from previous example

plt.show()

在这里输入图片描述

请注意,对数刻度似乎已被应用,但彩色图像(直方图)并未反映出这一点。 直方图的条形箱应该呈正方形!但它们不是因为艺术家创建的pcolorfast不支持对数轴。

为了解决这个问题,让我们使用np.histogram2dplt.hist2d背后使用的内容)制作直方图,然后使用支持对数轴的pcolormesh(或pcolor)进行绘制:

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1977)

x, y = np.random.random((2, 1000))
x = 10**x

xbins = 10**np.linspace(0, 1, 10)
ybins = np.linspace(0, 1, 10)

counts, _, _ = np.histogram2d(x, y, bins=(xbins, ybins))

fig, ax = plt.subplots()
ax.pcolormesh(xbins, ybins, counts.T)

ax.set_xscale('log')

plt.show()

请注意,这里必须转置counts,因为pcolormesh期望轴的顺序为(Y,X)。

现在我们得到了预期的结果:

enter image description here


1
注意:我刚发现你必须转置“counts”,否则X和Y轴会翻转!(您可以通过添加“y * = 0.3”来轻松检查:绘图的上半部分应该变黑。)我刚提交了一个编辑来修复它。 - jick
这非常有帮助。谢谢。 - danijar

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