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

时间:2018-02-17 18:33:31

标签: python matplotlib visualization

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

但是在this article(在“多变量六边形分档”标题下约2/3),它讨论了绘制尺寸与计数成比例的六边形,以便更清楚地观察趋势(参见该文章中的下图) )

enter image description here

我是否错过了允许此操作的关键字参数?

谢谢!

1 个答案:

答案 0 :(得分:3)

对于所讨论的情节,使用六边形分箱没有任何优势,因为六边形具有不同的尺寸,因此在整个图中不允许一致的分箱。但是,您可以使用常量分箱,只收缩没有最大值的单元格。

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

enter image description here

<小时/> 对于比较,可以通过散点图传输相同的信息。这段代码可能比上面的代码更直观。

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

enter image description here