2012-10-25 56 views
1

这里是我的问题:我有一个子文件夹层次结构,每个子文件夹都包含一个带有值的文件。例如:python matplotlib:从字符串索引数组绘制3d表面

  • 的folder1/
    • folderA /为result.xml
    • FolderB中/为result.xml
    • folderC /为result.xml
  • 文件夹2/
    • folderA/result.xml
    • folderB/result.xml
    • folderC /为result.xml
  • folder3/
    • folderA /为result.xml
    • FolderB中/为result.xml
    • folderC /为result.xml

我想画matplotlib与folder1到folder3作为X值,folderA到folderC作为Y值和相应的g结果(来自每个result.xml文件)作为Z值。但我不知道如何生成Z数组,以便matplotlib可以正确绘制曲面。

为了清楚起见,让我们说,我有两个数组:

x = ["folder1", "folder2", "folder3"] 
y = ["folderA", "folderB", "folderC"] 
X,Y = numpy.meshgrid (x,y) 

如何生成在Z阵列,所以我可以用它如下:

fig = plt.figure() 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(X,Y,Z) 

我的问题的关注只有数组的实际创建(维和填充),而不是访问XML文件或通过子文件夹。

谢谢!

回答

2

你可能会先转换你的x,y坐标为整数:

import numpy as np 
xi = np.arange(len(x)) 
yi = np.arange(len(y)) 
Xi, Yi = np.meshgrid(xi, yi) 

对于z阵列,您将需要一个值每个对x和y的(即('folder1', 'folderA'), ('folder1', 'folderB')...)。你可以做,在一个for循环:

Z = np.zeros(Xi.shape) 
for i in xi: 
    for j in xj: 
     xy_pair = (xi[i], yi[j]) 
     Z[j,i] = calcZ(xy_pair) 

我想这背后的calcZ功能逻辑取决于你如何从XML文件解析的数据。

为了清楚起见,在图中您可以更改刻度标签来表示您访问的文件夹/文件。

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1, projection='3d') 

# ... plot some stuff ... 

ax.set_xticks(xi) 
ax.set_yticks(yi) 
ax.set_xticklabels(x) 
ax.set_yticklabels(y) 

plt.show() 
+0

除了一些小错误,它工作正常!感谢您的帮助。 'np.range()'不存在,我使用'np.arange()'代替。 'Z [i,j]'指数的顺序是错误的,'Z [j,i]'工作。 – user1774443

+0

感谢您的更正。我更新了答案。 – btel