10

我只是想知道这是否可以做到。我尝试使用 numpy logspace 显式设置 bin,并且我还尝试将 xscale 设置为“log”。这些选项都不起作用。有没有人试过这个?

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

4

1 回答 1

18

它无法正常工作的原因是plt.hist2d使用该pcolorfast方法,该方法对于大图像效率更高,但不支持对数轴。

要获得在对数轴上正常工作的 2D 直方图,您需要使用np.histogram2d和自己制作ax.pcolor。但是,这只是多行代码。

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

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.hist2dpcolormeshpcolor

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)。)

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

在此处输入图像描述

于 2015-03-20T22:42:46.557 回答