Python 使用hist2d在matplotlib中创建对数线性打印

Python 使用hist2d在matplotlib中创建对数线性打印,python,matplotlib,histogram2d,Python,Matplotlib,Histogram2d,我只是想知道这是否可以做到。我已经尝试使用numpy logspace显式地设置垃圾箱,并且还尝试将xscale设置为“log”。这两种选择都不起作用。有人试过这个吗 我只想要一个带有对数x轴和线性y轴的2d直方图。它不能正常工作的原因是plt。hist2d使用pcolorfast方法,这对大图像更有效,但不支持对数轴 要使二维柱状图在对数轴上正常工作,您需要使用np.histogram2d和ax.pcolor自己制作。然而,这只是额外的一行代码 首先,让我们在线性轴上使用指数间隔的箱子: im

我只是想知道这是否可以做到。我已经尝试使用numpy logspace显式地设置垃圾箱,并且还尝试将xscale设置为“log”。这两种选择都不起作用。有人试过这个吗


我只想要一个带有对数x轴和线性y轴的2d直方图。

它不能正常工作的原因是
plt。hist2d
使用
pcolorfast
方法,这对大图像更有效,但不支持对数轴

要使二维柱状图在对数轴上正常工作,您需要使用
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()
(注意,我们必须在这里转置
计数
,因为
pcolormesh
期望轴的顺序为(Y,X)。)

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


请分享您的代码。注意:我刚刚发现您必须转置
计数
,否则X轴和Y轴将翻转!(你可以很容易地通过添加
y*=0.3
:图的上半部分应该变成黑色来检查。)刚刚提交了一个编辑来修复它。这非常有用。谢谢
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()