我一直在尝试使用与此相似的PolyCollection制作图表: http://matplotlib.org/examples/mplot3d/polys3d_demo.html
不同之处在于,我希望我的代码能够从文件夹中读取所有CSV文件并在其中绘制数据(而不是随机数)。每个CSV文件包含一个频谱,即两列和一定数量的行。我希望第一行是我的x值,第二行是相应的z值。
我试过了:
import os
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
fig=plt.figure()
ax = fig.gca(projection='3d')
input_path = 'input'
spectrumfiles = []
verts=[]
for root, dirs, files in os.walk(input_path):
for name in files:
if os.path.splitext(name)[1] == '.CSV' or os.path.splitext(name)[1] == '.csv':
spectrumfiles.append(os.path.join(root,name))
zs = np.arange(len(files))
for name in spectrumfiles:
spectrum = np.loadtxt(name, delimiter=',')
#xs = spectrum[:,0] #I tried this first but then realised that "spectrum
#ys = spectrum[:,1] #already has the needed shape
#verts.append(list(zip(xs,ys)))
verts.append(spectrum)
poly = PolyCollection(verts, facecolors=np.ones(len(verts))) #I'm not too bothered with
poly.set_alpha(0.7) #colours at the moment
ax.add_collection3d(poly, zs=zs, zdir='y')
plt.show()
现在,我得到的图表是空的。
编辑: 这里有4个样本FILES
EDIT2: 这里有一些关于stackoverflow的相关问题的链接。 - Matplotlib plot pulse propagation in 3d - Waterfall plot python?
答案 0 :(得分:1)
好的,轻松修复 - 您唯一的问题是因为您自己将PolyCollection添加到轴上,它不会自动将x / y / z限制缩放到适当的值(仍然显示在0和1之间)。对于您拥有的数据,如果添加以下行:
ax.set_xlim(0,5000)
ax.set_ylim(0,len(spectrumfiles))
然后你的数据会神奇地出现。