基于频率的 pyplot.hexbin 中的十六进制大小

L. *_*son 4 python visualization matplotlib

有没有办法根据六边形的频率增加 pyplot.hexbin 中六边形的相对大小?我只能看到关键字参数的 binsize,它会影响十六进制的数量,但不会影响它们的大小。

但是在这篇文章中(大约 2/3 在标题“多元六边形分箱”下),它讨论了绘制大小与计数成正比的六边形,以便更清楚地观察趋势(见下图)

在此处输入图片说明

我是否错过了允许这样做的关键字参数?

谢谢!

Imp*_*est 9

对于有问题的图,使用六边形分箱没有优势,因为六边形具有不同的尺寸,因此不允许在整个图中进行一致的分箱。但是,您可以使用恒定分箱并仅缩小没有最大值的单元格。

import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection
from matplotlib.path import Path
from matplotlib.patches import PathPatch
import numpy as np; np.random.seed(42)

a = np.random.rand(200,2)
b = np.random.rand(200)
c = np.concatenate((a,np.c_[b,b]), axis=0)

fig, ax = plt.subplots()

hexbin = ax.hexbin(c[:,0],c[:,1],gridsize=20, linewidth=0 )

def sized_hexbin(ax,hc):
    offsets = hc.get_offsets()
    orgpath = hc.get_paths()[0]
    verts = orgpath.vertices
    values = hc.get_array()
    ma = values.max()
    patches = []
    for offset,val in zip(offsets,values):
        v1 = verts*val/ma+offset
        path = Path(v1, orgpath.codes)
        patch = PathPatch(path)
        patches.append(patch)

    pc = PatchCollection(patches)
    pc.set_array(values)
    ax.add_collection(pc)
    hc.remove()

sized_hexbin(ax,hexbin)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


为了进行比较,可以通过散点图传输相同的信息。这段代码可能比上面的更直观。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(42)

a = np.random.rand(200,2)
b = np.random.rand(200)
c = np.concatenate((a,np.c_[b,b]), axis=0)

fig, ax = plt.subplots()

h, ex, ey = np.histogram2d(c[:,0],c[:,1], bins=np.linspace(0,1,20))

X,Y = np.meshgrid(ex[:-1]+np.diff(ex)/2.,ey[:-1]+np.diff(ey)/2.)

ax.scatter(X.flatten(),Y.flatten(), 
           c=h.T.flatten(), s=h.T.flatten()**2,
           marker="h")

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明