2015-07-10 192 views
0

我使用食譜例子frin http://wiki.scipy.org/Cookbook/Matplotlib/Gridding_irregularly_spaced_data來製作輪廓圖。然而,我的一些數據可能只包含零,在這種情況下,我得到一個ValueError:零大小的數組來減少操作的最小值,它沒有身份。當輪廓不存在時,Matplotlib輪廓圖失敗

import numpy as np 
from scipy.interpolate import griddata 
import matplotlib.pyplot as plt 
from numpy.random import uniform, seed 


# make up some randomly distributed data 
seed(1234) 
npts = 200 
x = uniform(-2,2,npts) 
y = uniform(-2,2,npts) 
z = 0*x*np.exp(-x**2-y**2) #Here i multiply by zero 
# define grid. 
xi = np.linspace(-2.1,2.1,100) 
yi = np.linspace(-2.1,2.1,100) 
# grid the data. 
zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='cubic') 

#zi[0][0]=0.00001 would make everything ok again 
print(zi) 
# do the plotting and save the result 
CS = plt.contour(xi, yi, zi) 
plt.show() 

有沒有一種優雅的方式來處理這個問題? 這是值得在matplotlib票?

+0

如何將你喜歡的代碼的行爲?你提供的數據不好,你會得到一個例外。聽起來對我很好。 – Christoph

+0

嗯,我不會說我提供「壞」數據。 z = 0 * x * np.exp(-x ** 2-y ** 2)+ 0.0000001,工作幷包含儘可能多的信息。 – Underdetermined

+0

然而,在使用griddata執行上述代碼的插值之後,您將得到一組NaN而不是一組0或其他數字,這些數字是「不好的」,因爲很難決定如何使用這些數字等高線圖。拋出異常似乎是一個合理的迴應。 – Tommy

回答

1

爲什麼不直接捕獲異常,即:

try: 
    CS = plt.contour(xi, yi, zi) 
    plt.show() 
except ValueError: 
    print("Can't plot this data") 
+0

感謝您的回答,我目前的解決方法是:如果numpy.max(zi)== numpy.min(zi)== 0: zi [0] [0] = 0.00000001,因爲我仍然喜歡一個情節。有關異常處理更優雅的東西。 – Underdetermined