2015-07-13 47 views
1

我正在嘗試使用matplotlib使用Rbf插值函數scipy.interpolate模塊從具有四列和48000行(即48000個數據點)的數據文件製作等高線圖。第一列和第二列是等值線圖的兩個獨立變量。第三和第四列是兩個變量要繪製在單獨的面板中。在從大數據文件製作等高線圖時顯示「值錯誤:數組太大」錯誤。怎麼修?

https://drive.google.com/file/d/0B2HPaW59cSeQbW9PYVBkTHdHTlk/view?usp=sharing

的代碼如下:數據文件可以從下面的鏈接下載在Rbf函數調用作爲線路

import numpy 
from matplotlib import pyplot as plt 
from matplotlib import rc, colorbar 
from scipy.interpolate import Rbf 

def forceAspect(ax,aspect=1): 
    im = ax.get_images() 
    extent = im[0].get_extent() 
    ax.set_aspect(abs((extent[1]-extent[0])/(extent[3]-extent[2]))/aspect) 

# Import data: 
x, y, z1, z2 = numpy.loadtxt("data_contourplot.dat", 
usecols = (0,1, 2, 3), unpack = True) 

# Set up a regular grid of interpolation points 
xi = numpy.linspace(min(x), max(x), 100) 
yi = numpy.linspace(min(y), max(y), 100) 
xi, yi = numpy.meshgrid(xi,yi) 

rbf1 = Rbf(x, y, z1, function='linear') 
rbf2 = Rbf(x, y, z2, function='linear') 
z1i = rbf1(xi, yi) 
z2i = rbf2(xi, yi) 

fig1 = plt.figure(num=None, figsize=(8, 4), dpi=80, facecolor='w', edgecolor='k') 
ax = plt.subplot(121) 
cax = ax.imshow(z1i, vmin=z1.min(), vmax=z1.max(), origin='lower', 
     extent=[x.min(), x.max(), y.min(), y.max()]) 

#Function to adjust the layout of the plot 
forceAspect(ay,aspect=1) 

#plt.tight_layout() 
fig1.colorbar(cay) 
plt.show() 

錯誤出現如下:

Traceback (most recent call last): 
File "plot_contour_Ion_vs_delay_E_c.py", line 29, in <module> 
rbf1 = Rbf(x, y, z1, function='linear') 
File "/usr/lib/python2.7/dist-packages/scipy/interpolate/rbf.py", line 185, in __init__ 
r = self._call_norm(self.xi, self.xi) 
File "/usr/lib/python2.7/dist-packages/scipy/interpolate/rbf.py", line 207, in _call_norm 
return self.norm(x1, x2) 
File "/usr/lib/python2.7/dist-packages/scipy/interpolate/rbf.py", line 107, in _euclidean_norm 
return sqrt(((x1 - x2)**2).sum(axis=0)) 
ValueError: array is too big. 

請幫我解決這個問題。 Rbf函數對大小處理有一些限制。在Python中編寫大規模數據文件和輪廓圖或任何2D/3D圖的一般編碼標準做法是什麼?

回答

0

我用R-樹,用於內插僅基於當前點區域的:

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib import rc, colorbar 
from scipy.interpolate import Rbf 
from rtree import index 

def forceAspect(ax,aspect=1): 
    im = ax.get_images() 
    extent = im[0].get_extent() 
    ax.set_aspect(abs((extent[1]-extent[0])/(extent[3]-extent[2]))/aspect) 


def norm(x1, x2): 
    return ((x1 - x2)**2).sum(axis=0) 

# Import data: 
x, y, z1, z2 = np.loadtxt("data_contourplot.dat", 
    usecols = (0, 1, 2, 3), unpack = True) 

idx = index.Index() 
step_x = 0.1 
step_y = 0.15 
for i in range(x.shape[0]): 
    idx.insert(i, (x[i] - step_x, y[i] - step_y, x[i] + step_x, y[i] + step_y)) 

# Set up a regular grid of interpolation points 
xi = np.linspace(min(x), max(x), 100) 
yi = np.linspace(min(y), max(y), 100) 
xi, yi = np.meshgrid(xi, yi) 

flat_xi = xi.flat 
flat_yi = yi.flat 
z1i = np.zeros_like(flat_xi) 
z2i = np.zeros_like(flat_xi) 
for i, (xif, yif) in enumerate(zip(flat_xi, flat_yi)): 
    ind = np.array(list(idx.intersection((xif - step_x*2, yif - step_y*2, xif + step_x*2, yif + step_y*2)))) 
    rbf1 = Rbf(x[ind], y[ind], z1[ind], function='linear') 
    rbf2 = Rbf(x[ind], y[ind], z2[ind], function='linear') 
    z1i[i] = rbf1(xif, yif) 
    z2i[i] = rbf2(xif, yif) 
    if i % 100 == 0: 
     print(i) 

z1i = np.resize(z1i, xi.shape) 
z2i = np.resize(z2i, xi.shape) 

fig1 = plt.figure(num=None, figsize=(8, 4), dpi=80, facecolor='w', edgecolor='k') 
ax = plt.subplot(121) 
cax = ax.imshow(z1i, vmin=z1.min(), vmax=z1.max(), origin='lower', 
     extent=[x.min(), x.max(), y.min(), y.max()]) 

#Function to adjust the layout of the plot 
forceAspect(ax,aspect=1) 

#plt.tight_layout() 
fig1.colorbar(cax) 
plt.show()