是否可以在matplotlib hexbin图上绘制相同点的列表?

时间:2013-02-08 19:57:25

标签: python matplotlib

我有这个非常简单的代码,它绘制了100个点(10,10)的列表,这些列表都是相同的。不幸的是,我收到了警告和空白图表。

我的代码:

import matplotlib.pyplot as plt

mylist = list()
for i in range(100):
    mylist.append(10)

def plot():

    plt.subplot(111)
    plt.hexbin(mylist,mylist,bins='log', cmap=plt.cm.YlOrRd_r)
    plt.axis([0,50,0,50])

    plt.show()

plot()

警告: enter image description here

  1. 是否无法在hexbin
  2. 中绘制相同的数据
  3. 我做错了吗?
  4. 我的具体情况:

    我理解这可能是一个奇怪的问题,但我的程序正在绘制大量的点(x,y)(当然进入hexbin),有时这些点可能都是相同的。

    如果我略微更改上面的代码并在list[i](我是任何索引)处抛出不同的点(x,y),代码运行良好并绘制数据。

2 个答案:

答案 0 :(得分:2)

问题在于,它试图通过查看最大和最小xy值来猜测网格的限制,并使步长sx = (x_max - x_min) / num_x_bins严格为零在这个输入的情况下。解决方案是使用extent关键字告诉代码创建数组的大小。

mylist = list()
for i in range(100):
    mylist.append(10)

def plot():

    plt.subplot(111)
    plt.hexbin(mylist,mylist,bins='log', cmap=plt.cm.YlOrRd_r, extent=[0, 50, 0, 50])
    plt.axis([0,50,0,50])

    plt.show()

plot()

有一个公关来解决这个问题(应该是1.4 https://github.com/matplotlib/matplotlib/pull/3038

与此同时,我会使用类似的东西(未经测试,此处可能存在一些微不足道的错误):

import matplotlib.transfroms as mtrans
def safe_hexbin(ax, x, y, *args, **kwargs):
      if 'extent' not in kwargs:
          xmin = np.amin(x)
          xmax = np.amax(x)
          ymin = np.amin(y)
          ymax = np.amax(y)
          # to avoid issues with singular data, expand the min/max pairs
          xmin, xmax = mtrans.nonsingular(xmin, xmax, expander=0.1)
          ymin, ymax = mtrans.nonsingular(ymin, ymax, expander=0.1)
          kwargs['extent'] = (xmin, xmax, ymin, ymax)
      return ax.hexbin(x, y, *args, **kwargs)


safe_hexbin(plt.gca(), x, y, ...)

答案 1 :(得分:-1)

我看到你正在做的事情有几个问题:

  1. 使用带有日志值的零
  2. 您的myList值均为10
  3. 可能未向hexbins提供您的用例所需的所有输入
  4. 所以我得到了输出:

    import numpy as np
    import matplotlib.pyplot as plt
    x = np.logspace(-1, 2)
    y = np.logspace(-1, 2)
    x = np.hstack([x, x])  # duplicate all points
    y = np.hstack([y, y])  # duplicate all points
    xx, yy = np.meshgrid(x,y)
    C = xx**2 + 10./yy**2
    fig, ax = plt.subplots()
    ax.hexbin(x, y, C, bins='log', cmap=plt.cm.YlOrRd_r)
    plt.show()