matplotlib有没有MATLAB "stem3"的对应功能?

9 投票
3 回答
3497 浏览
提问于 2025-04-17 08:05

在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')
#                ---------------

3

就像unutbu的那样,只是用了一个普通的图表:

from mpl_toolkits.mplot3d import Axes3D
fig = figure()
ax = fig.add_subplot(111, projection='3d')
x = [2,4,1,3]
y = [3,5,6,7]
z = [4,5,6,7]  
for xx,yy,zz in zip(x,y,z): 
    plot([xx,xx], [yy,yy], [0,zz], '-')

生成的图表

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()

在这里输入图片描述

撰写回答