Matplotlib中的hexbin规范化

4
我希望使用matplotlib制作多个x y数据的hexbin密度图,类似于这个例子:http://matplotlib.org/1.4.0/examples/pylab_examples/hexbin_demo.html。但是我想将每个六边形的计数除以给定数字(我的密度图中的最高峰值),以便所有的密度图都有相同的颜色,并且颜色条对于所有的图都是[0,1]范围内的。请问是否可以给我一个工作的示例?谢谢!
2个回答

9
我看到两种潜在的方法来实现这一点。
方法1
第一种方法是调用hexbin来获取您的最大值,然后使用reduce_C_function输入选项执行另一个hexbin调用来缩放您的数据。对于执行归一化的问题在于,在创建hexbin之后,您不知道每个bin中有多少个点。使用您链接到的示例数据(但仅创建线性比例尺图),代码如下:
plt.subplot(111)
hb = plt.hexbin(x,y, cmap=plt.cm.YlOrRd_r)
plt.cla()
plt.hexbin(x, y,
           C=np.ones_like(y, dtype=np.float) / hb.get_array().max(),
           cmap=plt.cm.YlOrRd_r,
           reduce_C_function=np.sum)
plt.axis([xmin, xmax, ymin, ymax])
cb = plt.colorbar()

在第二个六边形调用中,您必须提供C数组才能使用reduce_C_function选项。在这种情况下,C=np.ones_like(y) / hb.get_array().max()就足够了,因为您只需要对值求和。
请注意,在第一个六边形调用之后清除轴可能是有意义的。
使用此方法的一个问题是,您将具有空箱(白色空间),其中没有点。如果您希望背景与零值相同颜色,则可以添加plt.gca().set_axis_bgcolor(plt.cm.YlOrRd_r(0))
方法2
另一种方法是简单地使用六边形固有的自动缩放,并重新标记色条。例如:
plt.subplot(111)
hb = plt.hexbin(x,y, cmap=plt.cm.YlOrRd_r)
plt.axis([xmin, xmax, ymin, ymax])
cb = plt.colorbar()
cb.set_ticks(np.linspace(hb.get_array().min(), hb.get_array().max(), 6))
cb.set_ticklabels(np.linspace(0, 1., 6))

请注意,必须使用计数的颜色条刻度设置器,但是您可以将标签设置为所需范围。个人而言,我更喜欢第二种方法,因为它更简洁,但我可以想象第一种方法更有用的情况。

非常好的解决方案,解释也非常易懂。谢谢Farenorth!我之前尝试的一部分是我错过了"reduce_C_function=np.sum"这一部分。你能解释一下reduce_C_function的作用吗?再次感谢!Janos - user2393987
它被应用于每个箱中找到的值,以计算一个表示为颜色的单个值。在此处搜索'reduce_C_function'以获取更多详细信息:http://matplotlib.org/api/pyplot_api.html。 - farenorth

0

@farenorth的第二种方法非常好。 也可以使用以下方法来获取六边形密度图:

cb.set_ticks(np.linspace(hb.get_array().min(), hb.get_array().max(), 6))
cb.set_ticklabels(['%.4f'%x for x in np.linspace(hb.get_array().min()/hb.get_array().sum(), hb.get_array().max()/hb.get_array().sum(), 6)])

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