2017-03-14 70 views
1

我使用library,它產生3個給定對象k的圖。從Python中的對象獲取數據數組

我需要計算產生這些圖的數據點(x,y,z),但問題是這些圖來自於k的函數。

我正在使用的庫是pyKrigingthis是他們的github存儲庫。

其示例code的簡化版本是:

import pyKriging 
from pyKriging.krige import kriging 
from pyKriging.samplingplan import samplingplan 

sp = samplingplan(2) 
X = sp.optimallhc(20) 

testfun = pyKriging.testfunctions().branin 
y = testfun(X) 

k = kriging(X, y, testfunction=testfun, name='simple') 
k.train() 
k.plot() 

的完整代碼,註釋和輸出可以發現here

總之,我試圖獲得產生這些圖的numpy數組,因此我可以創建跟隨我的格式樣式的圖。

我對Python中的圖書館代碼不太瞭解,我非常感謝您的幫助!

+0

你有什麼格式樣式?你可以先設置它們,然後調用'k.plot()'。 – ImportanceOfBeingErnest

+0

您是否期待我們搜索'kringing'文檔和/或代碼以找到它?答案在於他們的代碼。這不是一個普遍的'numpy'問題。在'pandas'中,您使用'.values'方法從數據框中提取數組。 – hpaulj

+0

您可能想直接在'github'或'pyKriging'網站上提出這個問題。這是一個複雜的代碼,正如@hpaulj指出的,沒有人會通過代碼並向您提供答案。 –

回答

1

沒有生成圖的單個數據數組。相反,許多用於繪圖的數組都是在克里格圖函數內部生成的。
將填充輪廓更改爲線輪廓當然不是樣式選項。因此需要使用原始繪圖功能中的代碼。

一個選項是子類kriging並實現自定義繪圖功能(我們稱之爲myplot)。在此功能中,可以使用contour而不是contourf。當然,也可以根據需要完全改變它。

import pyKriging 
from pyKriging.krige import kriging 
from pyKriging.samplingplan import samplingplan 
import numpy as np 
import matplotlib.pyplot as plt 

class MyKriging(kriging): 
    def __init__(self,*args,**kwargs): 
     kriging.__init__(self,*args,**kwargs) 
    def myplot(self,labels=False, show=True, **kwargs): 
     fig = plt.figure(figsize=(8,6)) 
     # Create a set of data to plot 
     plotgrid = 61 
     x = np.linspace(self.normRange[0][0], self.normRange[0][1], num=plotgrid) 
     y = np.linspace(self.normRange[1][0], self.normRange[1][1], num=plotgrid) 
     X, Y = np.meshgrid(x, y) 
     # Predict based on the optimized results 
     zs = np.array([self.predict([xi,yi]) for xi,yi in zip(np.ravel(X), np.ravel(Y))]) 
     Z = zs.reshape(X.shape) 
     #Calculate errors 
     zse = np.array([self.predict_var([xi,yi]) for xi,yi in zip(np.ravel(X), np.ravel(Y))]) 
     Ze = zse.reshape(X.shape) 

     spx = (self.X[:,0] * (self.normRange[0][1] - self.normRange[0][0])) + self.normRange[0][0] 
     spy = (self.X[:,1] * (self.normRange[1][1] - self.normRange[1][0])) + self.normRange[1][0] 

     contour_levels = kwargs.get("levels", 25) 
     ax = fig.add_subplot(222) 
     CS = plt.contour(X,Y,Ze, contour_levels) 
     plt.colorbar() 
     plt.plot(spx, spy,'or') 

     ax = fig.add_subplot(221) 
     if self.testfunction: 
      # Setup the truth function 
      zt = self.testfunction(np.array(zip(np.ravel(X), np.ravel(Y)))) 
      ZT = zt.reshape(X.shape) 
      CS = plt.contour(X,Y,ZT,contour_levels ,colors='k',zorder=2, alpha=0) 

     if self.testfunction: 
      contour_levels = CS.levels 
      delta = np.abs(contour_levels[0]-contour_levels[1]) 
      contour_levels = np.insert(contour_levels, 0, contour_levels[0]-delta) 
      contour_levels = np.append(contour_levels, contour_levels[-1]+delta) 

     CS = plt.contour(X,Y,Z,contour_levels,zorder=1) 
     plt.plot(spx, spy,'or', zorder=3) 
     plt.colorbar() 

     ax = fig.add_subplot(212, projection='3d') 
     ax.plot_surface(X, Y, Z, rstride=3, cstride=3, alpha=0.4) 
     if self.testfunction: 
      ax.plot_wireframe(X, Y, ZT, rstride=3, cstride=3) 
     if show: 
      plt.show() 



sp = samplingplan(2) 
X = sp.optimallhc(20) 

testfun = pyKriging.testfunctions().branin 
y = testfun(X) 

k = MyKriging(X, y, testfunction=testfun, name='simple') 
k.train() 
k.myplot() 

enter image description here

+0

這當然是@ImportanceOfBeingErnest這個問題的答案。爲了得到產生這些圖的數據數組,我添加了'return X,Y,Z'。現在,我只想要這些數據數組(「X,Y,Z」)供進一步使用,我不介意繪製它。是否有另一種使用子類來''返回'X','Y','Z'等數組的方法?如果是這樣,這肯定是這個問題和標題的更一般的答案。謝謝! – yellow01

+1

用於繪圖的數組是'X','Y','Z','ZT'和'Ze'。 Thery是在繪圖方法中生成的。如果您只需要那些可以從自定義繪圖函數中刪除與繪圖有關的所有內容,並只返回那些數組。 – ImportanceOfBeingErnest