这是我的问题:我有一个子文件夹层次结构,每个子文件夹都包含一个带有值的文件。例如:
我想用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文件或浏览子文件夹。
谢谢!
答案 0 :(得分: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()