首页 > 解决方案 > 如何使用 matplotlib 获得稳定的绘图

问题描述

我正在尝试使用 matplotlib 绘制手部的 3D 姿势。对于视频的每一帧,或者我们可以说如果数据发生了变化,那么绘图大小(X,Y,Z)也随着对象(手部姿势)的大小和位置而变化。下面的更多细节是下一个和上一个帧的两个屏幕截图,在屏幕截图中我们可以看到 x、y 和 z 轴随着手部姿势的变化而变化。

图像_1 图像_2

我的问题是如何获得一个稳定的图,它的大小不会改变,即使对象位置会改变。

作为下面的参考,另一张图片显示了一个稳定的情节,我正在努力做到这一点。正如我们所见,输入帧和对象大小正在变化,但绘图大小相同。无论对象大小是否会在绘图中更改。

结果_图像

下面是我的绘图代码。请把它当作绘图样本,我只分享绘图代码,因为问题在于绘图代码。

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.view_init(elev=20, azim=75)
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
rgb_dict = get_keypoint_rgb(skeleton)
    
for i in range(len(skeleton)): # here is skeleton, just ignore it
    joint_name = skeleton[i]['name']
    pid = skeleton[i]['parent_id']
    parent_joint_name = skeleton[pid]['name']

    x = np.array([kps_3d[i, 0], kps_3d[pid, 0]]) # kps_3d is pose data
    y = np.array([kps_3d[i, 1], kps_3d[pid, 1]])
    z = np.array([kps_3d[i, 2], kps_3d[pid, 2]])

    ax.plot(x, z, -y, c = np.array(rgb_dict[parent_joint_name])/255., linewidth = line_width)
    ax.scatter(kps_3d[i, 0], kps_3d[i, 2], -kps_3d[i, 1], c = np.array(rgb_dict[joint_name]).reshape(1, 3)/255., marker='o')
    ax.scatter(kps_3d[pid, 0], kps_3d[pid, 2], -kps_3d[pid, 1], c = np.array(rgb_dict[parent_joint_name]).reshape(1, 3)/255., marker='o')

正如ax.scatter 文档所示,它用于获取y 与 x 的散点图,标记大小和/或颜色不同

我可以使用哪个替代函数来获得稳定的图?

寻找一些有价值的建议。

标签: pythonmatplotlib

解决方案


尝试通过这些代码行设置绘图限制:

ax.set_xlim3d(-0.1, 0.1)
ax.set_ylim3d(-0.1, 0.1)
ax.set_zlim3d(-0.1, 0.1)

根据需要调整数字。您可能还需要调整视角:

ax.view_init(elev=28., azim=55)

推荐阅读