问题 如何为hist2d图添加颜色条


好吧,我知道如何直接用图形创建图形时为图形添加颜色条 matplotlib.pyplot.plt

from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
import numpy as np

# normal distribution center at x=0 and y=5
x = np.random.randn(100000)
y = np.random.randn(100000) + 5

# This works
plt.figure()
plt.hist2d(x, y, bins=40, norm=LogNorm())
plt.colorbar()

但是为什么以下不起作用,我需要添加什么才能调用 colorbar(..) 使它工作。

fig, ax = plt.subplots()
ax.hist2d(x, y, bins=40, norm=LogNorm())
fig.colorbar()
# TypeError: colorbar() missing 1 required positional argument: 'mappable'

fig, ax = plt.subplots()
ax.hist2d(x, y, bins=40, norm=LogNorm())
fig.colorbar(ax)
# AttributeError: 'AxesSubplot' object has no attribute 'autoscale_None'

fig, ax = plt.subplots()
h = ax.hist2d(x, y, bins=40, norm=LogNorm())
plt.colorbar(h, ax=ax)
# AttributeError: 'tuple' object has no attribute 'autoscale_None'

9781
2018-02-22 09:25


起源



答案:


你差不多第3个选择。你必须通过 mappable 反对 colorbar 所以它知道什么颜色图和限制给色条。那可以是一个 AxesImage 要么 QuadMesh

如果是 hist2D,元组返回你的 h 包含那个 mappable,还有其他一些东西。

来自 文档

返回:   返回值为(count,xedges,yedges,Image)。

所以,要制作彩条,我们只需要 Image

要修复您的代码:

from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
import numpy as np

# normal distribution center at x=0 and y=5
x = np.random.randn(100000)
y = np.random.randn(100000) + 5

fig, ax = plt.subplots()
h = ax.hist2d(x, y, bins=40, norm=LogNorm())
plt.colorbar(h[3], ax=ax)

或者:

counts, xedges, yedges, im = ax.hist2d(x, y, bins=40, norm=LogNorm())
plt.colorbar(im, ax=ax)

13
2018-02-22 09:55



fig.colorbar(im) 也有效,似乎与答案的其余部分更加一致。 - ThomasH


答案:


你差不多第3个选择。你必须通过 mappable 反对 colorbar 所以它知道什么颜色图和限制给色条。那可以是一个 AxesImage 要么 QuadMesh

如果是 hist2D,元组返回你的 h 包含那个 mappable,还有其他一些东西。

来自 文档

返回:   返回值为(count,xedges,yedges,Image)。

所以,要制作彩条,我们只需要 Image

要修复您的代码:

from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
import numpy as np

# normal distribution center at x=0 and y=5
x = np.random.randn(100000)
y = np.random.randn(100000) + 5

fig, ax = plt.subplots()
h = ax.hist2d(x, y, bins=40, norm=LogNorm())
plt.colorbar(h[3], ax=ax)

或者:

counts, xedges, yedges, im = ax.hist2d(x, y, bins=40, norm=LogNorm())
plt.colorbar(im, ax=ax)

13
2018-02-22 09:55



fig.colorbar(im) 也有效,似乎与答案的其余部分更加一致。 - ThomasH