matplotlib有没有MATLAB "stem3"的对应功能?
在MATLAB中,使用 stem3
命令制作三维柱状图非常简单。
那么在matplotlib中有没有类似的命令呢?我查看了最新版本的在线文档,但没有找到。有没有人能给一些建议,告诉我怎么把这些数据绘制成三维柱状图呢?
import numpy as np
N = 50
theta = np.linspace(0, 2*np.pi, N, endpoint=False)
x = np.cos(theta)
y = np.sin(theta)
z = range(N)
3 个回答
1
matplotlib 3.4.0的新功能
在这个版本中,内置的 ax.stem
现在支持3D图形了。你只需要通过 subplot_kw
创建3D坐标轴,然后把3个数组传给 ax.stem
就可以了:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
# -------------------------------
ax.stem(x, y, z)
ax.set(xlabel='x', ylabel='y', zlabel='z')
注意,图形的“茎”可以沿着任何一个轴进行调整:
orientation='z'
: “茎”在xy
平面上,沿着z
方向投影 (默认)orientation='y'
: “茎”在xz
平面上,沿着y
方向投影orientation='x'
: “茎”在yz
平面上,沿着x
方向投影
fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
ax.stem(x, y, z, orientation='x')
# ---------------
13
我不知道在matplotlib中有没有和stem3
完全相同的功能。不过,使用Line3D来画这样的图形其实并不难(至少在基本形式上是这样):
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.art3d as art3d
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
N = 100
theta = np.linspace(0, 2*np.pi, N, endpoint=False)
x = np.cos(theta)
y = np.sin(theta)
z = range(N)
for xi, yi, zi in zip(x, y, z):
line=art3d.Line3D(*zip((xi, yi, 0), (xi, yi, zi)), marker='o', markevery=(1, 1))
ax.add_line(line)
ax.set_xlim3d(-1, 1)
ax.set_ylim3d(-1, 1)
ax.set_zlim3d(0, N)
plt.show()