matplotlib hexbin中的不规则瓷砖尺寸

时间:2013-06-27 22:11:45

标签: matplotlib size tile

在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()

this image中,格子大小为30,您可以看到备用行被垂直压扁:

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

hexbin文档显示:

  

gridsize:[100 |整数]

     

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

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

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

1 个答案:

答案 0 :(得分:6)

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

  

线宽:[无|标量]

     

如果为None,则默认为rc lines.linewidth。   请注意,这是一个元组,如果您设置了linewidths参数   必须按照要求将其设置为一系列浮点数   RegularPolyCollection。

     

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

     

edgecolors:[无| '没有'| mpl颜色|颜色序列]

     

如果'无',   绘制边缘的颜色与填充颜色相同。这是   默认情况下,因为它避免了六边形之间难看的未上色像素。

     

如果为None,则以默认颜色绘制轮廓。

     

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

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