2014-04-15 63 views
0

我无法将多组数据绘制到单个3D散点图上。我正在做的是我有一个三个方程组,我用linalg计算方程的零点。然后我绘制每一组零点到一个3D图上。对于我的一个参数,我正在改变它的价值,并观察零值如何变化。我想在一个三维散点图上绘制所有数据集,以便比较它们之间的差异,但我始终为每个数据集绘制一张图。你们中的任何人都能弄清楚我需要解决什么问题吗?绘制3d散点图上的多个数据

import numpy as np 
from numpy import linalg 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

plt.close('all') 
#Will be solving the following system of equations: 
#sx-(b/r)z=0 
#-x+ry+(s-b)z=0 
#(1/r)x+y-z=0 

r=50.0 
b=17.0/4.0 
s=[10.0,20.0,7.0,r/b] 

color=['r','b','g','y'] 
markers=['s','o','^','d'] 

def system(s,b,r,color,m): 
#first creates the matrix as an array so the parameters can be changed from outside 
#and then coverts array into a matrix 
    u_arr=np.array([[s,0,-b/r],[-1,r,s-b],[1/r,1,-1]]) 
    u_mat=np.matrix(u_arr) 

    U_mat=linalg.inv(u_mat) 

    #converts matrix into an array and then into a list to manipulate 
    x_zeros=np.array(U_mat[0]).reshape(-1).tolist() 
    y_zeros=np.array(U_mat[1]).reshape(-1).tolist() 
    z_zeros=np.array(U_mat[2]).reshape(-1).tolist() 

    zeros=[x_zeros,y_zeros,z_zeros] 
    coordinates=['x','y','z'] 

    print('+'*70) 
    print('For s=%1.1f:' % s) 
    print('\n') 

    for i in range(3): 
     print('For the %s direction, the roots are: ' % coordinates[i]) 
     for j in range(3): 
      print(zeros[i][j]) 
     print('-'*50) 

    fig3d=plt.figure() 
    ax=Axes3D(fig3d) 
    ax.scatter(x_zeros,y_zeros,z_zeros,c=color,marker=m) 
    plt.title('Zeros for a Given System of Equations for s=%1.1f' % (s)) 
    ax.set_xlabel('Zeros in x Direction') 
    ax.set_ylabel('Zeros in y Direction') 
    ax.set_zlabel('Zeros in z Direction') 
    plt.show() 

for k in range(len(s)): 
    system(s[k],b,r,color[k],markers[k]) 

在此先感谢您的帮助。

回答

1

您每次调用system()时都会创建一个新轴实例。相反,通过ax作为参数传递给system

def system(s,b,r,color,m, ax): 

     # ... 
     ax.scatter(x_zeros,y_zeros,z_zeros,c=color,marker=m) 

然后循环

fig3d=plt.figure() 
ax=Axes3D(fig3d) 

for k in range(len(s)): 
    system(s[k],b,r,color[k],markers[k], ax) 

plt.show() 

这是所有的地块被添加到ax之前创建的轴实例。然后您可能想要考虑设置system()功能以外的轴标签等。将其分为两个功能,一个用于设置绘图,另一个用于创建所需数据并绘制它。