2013-02-08 76 views
2

我有這個非常簡單的代碼,繪製了100個點(10,10)的列表都是完全相同的。不幸的是,我收到警告和空白圖表。是否可以繪製matplotlib hexbin圖上相同點的列表?

我的代碼:

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. 我做錯了什麼?

我的具體情況:

我理解這可能是一個奇怪的問題,但我的程序繪製大量的點(X,Y)(進入當然hexbin),有時點可能都是相同的。

如果我稍微改變上面的代碼,並在list[i](我是任何索引)拋出一個不同的點(x,y),代碼運行良好並繪製數據。

+0

這實際上是一個錯誤https://github.com/matplotlib/matplotlib/issues/2863 – tacaswell 2014-05-03 17:44:43

+0

我其實現在正在重新討論這個問題。你有什麼建議如何解決它?也許我只需要在圖的範圍之外拋出一個任意的數據點,以便它總是繪製數據? @tcaswell – 2014-05-06 14:49:29

+0

看到編輯我的答案。讓用戶使用'extent' kwarg,你將完全避免這個錯誤。 – tacaswell 2014-05-06 15:24:01

回答

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

有一個PR來解決這個問題(這應該是在1.4 https://github.com/matplotlib/matplotlib/pull/3038

在此期間,我會使用類似(沒有測試過,有可能是在這裏的一些瑣碎的bug):

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. 與測井值
  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() 
+0

關於你的第二點 - 那是故意的。我正在策劃的要點很可能都是「(10,10)」。 – 2013-02-08 20:28:11

相關問題