在matplotlib中使用PolyCollection绘图

时间:2015-07-02 16:14:18

标签: python matplotlib mplot3d

我试图在matplotlib中绘制一个三维图。我必须在单个3D图中绘制四个(或多个)半径的频率与幅度分布。我正在查看matplotlib.collections中提供的PolyCollection命令,我也查看了示例,但我不知道如何使用现有数据来获得该图。

我拥有的数量的尺寸,

频率:4000 x 4, 振幅:4000 x 4, 半径:4

我想画一些类似的东西, enter image description here

X轴为频率,Y轴为半径,Z轴为振幅。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

PolyCollection需要一系列顶点,它们可以很好地匹配您想要的数据。你没有提供任何示例数据,所以我会做一些说明(我的200维度将是你的4000 ....虽然如果你有这么多的数据点,我可能会考虑不同的情节):< / p>

import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
from mpl_toolkits.mplot3d import axes3d
import numpy as np

# These will be (200, 4), (200, 4), and (4)
freq_data = np.linspace(0,300,200)[:,None] * np.ones(4)[None,:]
amp_data = np.random.rand(200*4).reshape((200,4))
rad_data = np.linspace(0,2,4)

verts = []
for irad in range(len(rad_data)):
    # I'm adding a zero amplitude at the beginning and the end to get a nice
    # flat bottom on the polygons
    xs = np.concatenate([[freq_data[0,irad]], freq_data[:,irad], [freq_data[-1,irad]]])
    ys = np.concatenate([[0],amp_data[:,irad],[0]])
    verts.append(list(zip(xs, ys)))

poly = PolyCollection(verts, facecolors = ['r', 'g', 'c', 'y'])
poly.set_alpha(0.7)

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

# The zdir keyword makes it plot the "z" vertex dimension (radius)
# along the y axis. The zs keyword sets each polygon at the
# correct radius value.
ax.add_collection3d(poly, zs=rad_data, zdir='y')

ax.set_xlim3d(freq_data.min(), freq_data.max())
ax.set_xlabel('Frequency')
ax.set_ylim3d(rad_data.min(), rad_data.max())
ax.set_ylabel('Radius')
ax.set_zlim3d(amp_data.min(), amp_data.max())
ax.set_zlabel('Amplitude')

plt.show()

大部分内容都与您提到的示例有关,我只是明确了您的特定数据集所在的位置。这产生了这个情节: example PolyCollection plot