8

在 matplotlib 中制作 hexbin 图时,我发现交替排列的六边形图块具有不同的大小,有时明显不同。这段演示代码展示了效果:

from matplotlib import pyplot as plt
from matplotlib import cm as cm
from matplotlib import mlab as ml
import numpy as np

n = 1e5
x = y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z1 = ml.bivariate_normal(X, Y, 2, 2, 0, 0)
Z2 = ml.bivariate_normal(X, Y, 4, 1, 1, 1)
ZD = Z2 - Z1
x = X.ravel()
y = Y.ravel()
z = ZD.ravel()
plt.subplot(111)

plt.hexbin(x, y, C=z, gridsize=30, cmap=cm.jet, bins=None)
plt.axis([x.min(), x.max(), y.min(), y.max()])

cb = plt.colorbar()
cb.set_label('mean value')
plt.show()

这张图片中,gridsize 为 30,您可以看到交替的行在垂直方向上被挤压了一点:

效果不是很显着,但在这个相同六边形图但网格大小为 80 的放大视图中,小行几乎是大行大小的一半。(生成的样本数据也开始与网格不对齐,但这是一个不重要的工件。)

hexbin 文档内容如下:

网格大小:[ 100 | 整数 ]

x 方向的六边形数量,默认为 100。选择 y 方向的相应六边形数量,使六边形近似规则。或者,gridsize 可以是一个具有两个元素的元组,指定 x 方向和 y 方向上六边形的数量。

它只保证六边形是“近似”规则的,但似乎,特别是在上面的 80-gridsize 图像这样的情况下,通过减少行数可以使六边形更接近规则,因此可以放大小行并且变得更规律。或者,正常大小的行可以垂直缩小,而小的行会垂直放大,保持所有行的高度相同,即使瓷砖不是规则形状的。

这种不规则的原因是什么,可以避免吗?

4

1 回答 1

6

经过更多的实验,我想我找到了原因。hexbin 的文档还提到:

线宽:[无| 标量]

如果没有,默认为 rclines.linewidth。请注意,这是一个元组,如果设置 linewidths 参数,则必须将其设置为浮点序列,如 RegularPolyCollection 所要求的。

其他控制 Collection 属性的关键字参数:

边缘颜色:[无| '无' | mpl 颜色 | 颜色顺序]

如果为“无”,则以与填充颜色相同的颜色绘制边缘。这是默认设置,因为它避免了六边形之间难看的未绘制像素。

如果没有,则以默认颜色绘制轮廓。

如果 matplotlib 颜色参数或 rgba 元组序列,则以指定颜色绘制轮廓。

通过将线宽设置为 (0,),我暴露了难看的未绘制像素,但我的六边形大小都相同。似乎某些六边形行位于较高层中,并且绘制的边界过大,突出于相邻行。线宽值 (1,) 给出了我之前看到的不均匀结果,因此它可能是默认值。0 到 1 之间的线宽(我使用的是 0.25)覆盖未绘制的像素而不会造成太多重叠,从而产生更好的图。但是,这只发生在通过 savefig() 以比默认值更高的 DPI 保存图像时(我使用的是 dpi=300)。调用 show() 或使用默认 DPI 保存会生成未绘制像素未覆盖的绘图。因此,虽然有效,但这种解决方法有些有限。

于 2013-06-28T20:16:02.070 回答