【问题标题】:matplotlib hexbin normalizematplotlib hexbin 标准化
【发布时间】:2015-06-04 18:31:52
【问题描述】:

我想用 matplotlib 制作 x y 数据的多个 hexbin 密度图,类似于这个: http://matplotlib.org/1.4.0/examples/pylab_examples/hexbin_demo.html

但是我想将每个六边形的计数除以给定的数字(我的密度图中的最高 peek 值),这样我的所有密度图都将具有相同的颜色,并且颜色条将是 [0,1] 范围适用于所有地块。

有人可以给我看一个可行的例子吗?

谢谢你的期待,

亚诺斯

【问题讨论】:

    标签: python matplotlib normalization density-plot


    【解决方案1】:

    @farenorth 的方法 2 非常好。 也可以改用下面的方法来得到一个 hexbin 密度图:

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

    【讨论】:

      【解决方案2】:

      我看到了两种可能的方法来做到这一点。

      方法一

      首先是调用 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()
      

      在第二个 hexbin 调用中,您必须提供 C 数组才能使用 reduce_C_function 选项。在这种情况下,您只需要C=np.ones_like(y) / hb.get_array().max(),因为您只需将这些值相加即可。

      请注意,在第一次 hexbin 调用之后清除坐标区可能是有意义的。

      这种方法的一个问题是您将在没有点的地方出现空箱(空白)。如果希望背景颜色与零值相同,可以添加plt.gca().set_axis_bgcolor(plt.cm.YlOrRd_r(0))

      方法二

      另一种方法是简单地使用 hexbin 中固有的自动缩放功能,然后简单地重新标记颜色条。例如:

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

      请注意,必须以计数为单位使用颜色条刻度设置器,但随后您将标签设置在您想要的范围内。就个人而言,我更喜欢第二种方法,因为它更干净一些,但我可以想象第一种更有用的情况。

      【讨论】:

      • 优秀的解决方案,非常具有指导性的解释。谢谢法瑞诺斯!我在之前的尝试中错过的一个部分是“reduce_C_function=np.sum”部分。你能解释一下 reduce_C_function 的作用吗?再次感谢!亚诺斯
      • 它应用于在每个 bin 中找到的值以计算单个值,然后将其表示为颜色。在此处搜索“reduce_C_function”:matplotlib.org/api/pyplot_api.html 了解更多详情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多