python - 如何使用 matplotlib 获得稳定的绘图
问题描述
我正在尝试使用 matplotlib 绘制手部的 3D 姿势。对于视频的每一帧,或者我们可以说如果数据发生了变化,那么绘图大小(X,Y,Z)也随着对象(手部姿势)的大小和位置而变化。下面的更多细节是下一个和上一个帧的两个屏幕截图,在屏幕截图中我们可以看到 x、y 和 z 轴随着手部姿势的变化而变化。
我的问题是如何获得一个稳定的图,它的大小不会改变,即使对象位置会改变。
作为下面的参考,另一张图片显示了一个稳定的情节,我正在努力做到这一点。正如我们所见,输入帧和对象大小正在变化,但绘图大小相同。无论对象大小是否会在绘图中更改。
下面是我的绘图代码。请把它当作绘图样本,我只分享绘图代码,因为问题在于绘图代码。
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 的散点图,标记大小和/或颜色不同。
我可以使用哪个替代函数来获得稳定的图?
寻找一些有价值的建议。
解决方案
尝试通过这些代码行设置绘图限制:
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)
推荐阅读
- flutter - Flutter:在小部件调用中使用参数(图标)
- angular - ngfor 用于具有 ng2-charts 的对象中的数组
- python - 如何仅保留数据框列的字符串中的数字?
- python - Python:每次运行函数时如何增加代码计数
- ios - 如何使多个协议符合一个类并设计方法来输入和打印详细信息?
- java - 如何在 GraphQL 中使用参数列表创建查询?
- javascript - 如何让机器人回复表情符号?
- html - 按索引删除不起作用。角
- if-statement - If语句具有多个agruments来捕获鼠标位置
- mysql - sql-query 获取包含事务计数的报告