Matplotlib hexbin中的瓷砖大小不规则

10
在matplotlib中制作六边形图时,我发现交替的六边形瓷砖行具有不同的大小,有时差别很大。以下演示代码显示了该效果:
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()

这张图片中,网格大小为30,在此可以看到交替的行在垂直方向上被压缩了一点:
效果并不是很明显,但在同样的六边形图但网格大小为80的放大视图中,小行的大小几乎只有大行的一半。(生成的示例数据也开始与网格失配,但这是一个无关紧要的现象。)
六边形文档读取如下:
gridsize:[100 | integer] x方向上的六边形数量,默认值为100。选择y方向上的相应数量以使六边形近似正则。或者,gridsize可以是一个包含两个元素的元组,指定x方向和y方向上的六边形数量。
它只保证六边形“近似”正则,但似乎特别是在像上面80网格大小的图像中,通过减少行数,可以使六边形更接近正则,从而可以放大并使小行更加正则。或者,可以将正常大小的行在垂直方向上缩小,同时将小行在垂直方向上放大,保持所有行的高度相同,即使瓷砖形状不规则。
这种不规则的原因是什么,是否可以避免?
1个回答

9
经过更多的尝试,我认为我已经找到了原因。hexbin的文档也提到了: linewidths: [ None | scalar ] 如果为None,则默认为rc lines.linewidth。 请注意,这是一个元组,如果您设置linewidths参数,则必须将其设置为浮点数序列,正如RegularPolyCollection所需。
其他控制集合属性的关键字参数: edgecolors: [ None | 'none' | mpl颜色 | 颜色序列 ] 如果为'none',则以与填充颜色相同的颜色绘制边缘。这是默认值,因为它避免了六边形之间不美观的未涂色像素。
如果为None,则以默认颜色绘制轮廓线。
如果为matplotlib颜色arg或rgba元组序列,则以指定颜色绘制轮廓线。
通过将linewidths设置为(0,),我暴露了不美观的未涂色像素,但我的六边形大小都相同。似乎某些六边形行在较高层,并用过大的边框绘制,突出显示邻近行。linewidths值为(1,)会导致我之前看到的不均匀结果,因此可能是默认值。0到1之间的linewidths(我使用0.25)可以覆盖未涂色像素而不会引起太多重叠,从而产生更漂亮的图。但是,只有在以比默认更高的DPI(我使用dpi = 300)保存图像时才会发生这种情况。调用show()或使用默认DPI保存会产生未涂色像素未被覆盖的图。因此,虽然有效,但这种解决方法受到一定限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接