1

这是我的问题:我有一个子文件夹的层次结构,每个子文件夹都包含一个具有值的文件。例如 :

  • 文件夹1/
    • 文件夹A/result.xml
    • 文件夹B/result.xml
    • 文件夹C/result.xml
  • 文件夹2/
    • 文件夹A/result.xml
    • 文件夹B/result.xml
    • 文件夹C/result.xml
  • 文件夹3/
    • 文件夹A/result.xml
    • 文件夹B/result.xml
    • 文件夹C/result.xml

我想用 matplotlib 绘制一个曲面,其中 folder1 到 folder3 作为 X 值,folderA 到 folderC 作为 Y 值,相应的结果(来自每个 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 文件或遍历子文件夹。

谢谢 !

4

1 回答 1

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()
于 2012-10-25T15:00:30.483 回答