【问题标题】:Irregular tile size in matplotlib hexbinmatplotlib hexbin中的不规则图块大小
【发布时间】:2013-06-27 22:11:45
【问题描述】:

在 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的同一个hexbin plot但gridsize为80的情况下,小行的大小几乎是大行的一半。 (生成的样本数据也开始与网格不对齐,但这是一个不重要的工件。)

hexbin 文档内容如下:

网格大小:[ 100 |整数]

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

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

这种异常的原因是什么,可以避免吗?

【问题讨论】:

    标签: matplotlib size tile


    【解决方案1】:

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

    线宽:[ 无 |标量]

    如果没有,默认为 rclines.linewidth。 请注意,这是一个元组,如果您设置 linewidths 参数,您 必须按照要求将其设置为浮点数序列 正则多边形集合。

    其他关键字参数控制 集合属性:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2021-08-05
      相关资源
      最近更新 更多