我想知道是否可以这样做。我已经尝试使用numpy logspace显式设置bin,还尝试将xscale设置为“log”。但这两个选项都无效。有人试过吗?
我只需要一个X轴为对数坐标轴,Y轴为线性坐标轴的二维直方图。
我想知道是否可以这样做。我已经尝试使用numpy logspace显式设置bin,还尝试将xscale设置为“log”。但这两个选项都无效。有人试过吗?
我只需要一个X轴为对数坐标轴,Y轴为线性坐标轴的二维直方图。
它不能正常工作的原因是因为plt.hist2d
使用了pcolorfast
方法,这对于大图像来说更加高效,但不支持对数坐标轴。
要在对数坐标轴上正确生成2D直方图,您需要使用np.histogram2d
和ax.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.histogram2d
(plt.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)。
现在我们得到了预期的结果: