Python 如何在matplotlib.pyplot中将colorbar与hist2d一起使用?
我想做一些类似的事情,但我已经了解到,在python交互模式之外的代码中使用pylab是一种不好的做法,所以我想使用matplotlib.pyplot来实现这一点。然而,我不知道如何使用pyplot使这段代码工作。使用pylab,给出的示例如下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
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()