2

我有这个非常简单的代码,它绘制了一个完全相同的 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()

警告: 在此处输入图像描述

  1. 不能在 a 上绘制相同的数据hexbin吗?
  2. 难道我做错了什么?

我的具体情况:

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

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

4

2 回答 2

2

问题是它试图通过查看最大值和最小值x以及y值来猜测网格的限制,并在此输入的情况下使步长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()

有一个 PR 可以解决这个问题(应该在 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, ...)
于 2013-02-09T01:03:17.640 回答
-1

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

  1. 对日志值使用零
  2. 你的myList值都是 10
  3. 可能没有hexbins为您的用例提供所有必要的输入

所以我得到这个输出:

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()
于 2013-02-08T20:16:42.943 回答