2017-03-14 67 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