Python 如何在matplotlib.pyplot中将colorbar与hist2d一起使用?

Python 如何在matplotlib.pyplot中将colorbar与hist2d一起使用?,python,matplotlib,Python,Matplotlib,我想做一些类似的事情,但我已经了解到,在python交互模式之外的代码中使用pylab是一种不好的做法,所以我想使用matplotlib.pyplot来实现这一点。然而,我不知道如何使用pyplot使这段代码工作。使用pylab,给出的示例如下 from matplotlib.colors import LogNorm from pylab import * #normal distribution center at x=0 and y=5 x = randn(100000) y = ran

我想做一些类似的事情,但我已经了解到,在python交互模式之外的代码中使用pylab是一种不好的做法,所以我想使用matplotlib.pyplot来实现这一点。然而,我不知道如何使用pyplot使这段代码工作。使用pylab,给出的示例如下

from matplotlib.colors import LogNorm
from pylab import *

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

hist2d(x, y, bins=40, norm=LogNorm())
colorbar()
show()
我已经试过很多次了

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
h1 = ax1.hist2d([1,2],[3,4])
从这里开始,我尝试了从
plt.colorbar(h1)
plt.colorbar(ax1)
plt.colorbar(fig)
ax.colorbar()
等各种方法,但我什么都不能用

总的来说,老实说,我不太清楚pylab和pyplot之间的关系,即使是在阅读之后。例如,pylab中的
show()
在pyplot中似乎变成了
plt.show()
,但由于某种原因
colorbar
没有变成
plt.colorbar()

例如,

这应该可以做到:

from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
from numpy.random import randn

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

H, xedges, yedges, img = plt.hist2d(x, y, norm=LogNorm())
extent = [yedges[0], yedges[-1], xedges[0], xedges[-1]]
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
im = ax.imshow(H, cmap=plt.cm.jet, extent=extent, norm=LogNorm())
fig.colorbar(im, ax=ax)
plt.show()

请注意,色条是如何附加到“fig”而不是“sub_plot”的。还有其他一些例子。请注意,您还需要使用
imshow
生成ScalarMapable,如API中所述。

颜色栏需要ScalarMapable对象作为其第一个参数
plt.hist2d
将其作为返回的元组的第四个元素返回

h = hist2d(x, y, bins=40, norm=LogNorm())
colorbar(h[3])
完整代码:

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

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

实际上
colorbar
保留在matplotlib本身中:。因此,您可能希望
将matplotlib导入为mpl
mpl.colorbar()
。谢谢
imshow()
似乎是将数字视为像素值?只是为了测试,我使用了x=[1,2,3]和y=[4,5,6],我不确定这是否正确,但我得到了一个非常平滑的彩虹图像,尽管我使用的是微型阵列,但我不知道是什么产生了这些图像。我还得到了一个从1到6的色条,这让我很困惑?理想情况下,我希望颜色条比例与直方图对齐,但它可能与imshow链接?
imshow
将给定的MxN数组绘制出来,并显示相应的直方图。我已经相应地修改了答案中的代码。要具体了解我所说的内容,请查看
H
,其中包含一个经过修改的示例,其中x=[1,2,3,3]y=[4,5,6,6]。如果去掉
norm
参数,现在就应该得到所需的。如果您想离散化输出,有一个很好的例子。还有其他一些很好的例子。请注意,
imshow
假设,如您所说,每个值都是一个像素值,因此每个颜色“框”的大小都与其他颜色框相同。如果您需要设置不同的大小(例如在地图投影上放置热图时),您应该使用。另一个注意事项:
im=ax.imshow(H,cmap=plt.cm.jet,extent=extent,norm=LogNorm())
应该是
im=ax.imshow(H.T,cmap=plt.cm.jet,extent=extent,norm=LogNorm(),origin='lower')
,将
H
更改为
H.T
并添加
,origin='lower'
,使
imshow()
看起来像
hist2d()