如何为hist2d图添加颜色条

时间:2017-02-22 09:25:34

标签: python matplotlib

好吧,当我用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'

1 个答案:

答案 0 :(得分:19)

你几乎有第三种选择。您必须将mappable对象传递给colorbar,以便知道为色条提供的色彩映射和限制。这可以是AxesImageQuadMesh等等。

如果是hist2D,则h中返回的元组包含mappable,但也包含其他一些元素。

来自docs

  

<强>返回:   返回值为(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)