You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正Matplotlib代码绘制学校常用风格的正交斜轴3D图?

实现学校风格正交投影3D图的Matplotlib代码修正方案

要实现y-z平面平行屏幕(y水平、z垂直)、x轴斜向下的正交投影,不能直接修改现有3D轴的变换矩阵,需要自定义完整的投影类适配Matplotlib的3D渲染流程。以下是可直接运行的修正代码:

完整代码实现

import matplotlib.pyplot as plt
from matplotlib.projections import ProjectionBase
from matplotlib.transforms import Affine2D
import numpy as np

class SchoolOrthogonalProjection(ProjectionBase):
    name = 'school_ortho'

    def __init__(self, fig, rect):
        super().__init__(fig, rect)
        # 调整skew_deg的第一个参数可改变x轴倾斜角度,30°为学校绘图常用值
        self.proj_transform = Affine2D().skew_deg(30, 0)

    def get_proj(self):
        # 基础正交投影矩阵,确保y-z平面完全贴合屏幕
        ortho_base = np.array([
            [1, 0, 0, 0],
            [0, 1, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 1]
        ])
        # 组合x轴倾斜变换与基础正交投影
        skew_mat = self.proj_transform.get_matrix()
        return np.dot(skew_mat, ortho_base)

    def draw(self, renderer):
        super().draw(renderer)
        # 调整轴标签对齐方式,匹配倾斜的x轴
        self.axis['xaxis'].label.set_rotation(30)
        self.axis['xaxis'].label.set_ha('right')
        self.axis['yaxis'].label.set_ha('center')
        self.axis['zaxis'].label.set_va('center')

# 注册自定义投影
plt.projections.register_projection(SchoolOrthogonalProjection)

# 绘制示例验证效果
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='school_ortho')

# 绘制立方体棱边
vertices = np.array([
    [0,0,0], [1,0,0], [1,1,0], [0,1,0],
    [0,0,1], [1,0,1], [1,1,1], [0,1,1]
])
edges = [[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]]
for edge in edges:
    ax.plot3D(*vertices[edge].T, c='black')

# 设置轴标签与范围
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_xlim(0, 1.5)
ax.set_ylim(0, 1.5)
ax.set_zlim(0, 1.5)

# 可选:关闭网格,贴合手绘风格
ax.grid(False)

plt.show()

关键修正说明

  1. 自定义投影类:必须继承ProjectionBase并实现get_proj方法,这是Matplotlib 3D渲染的核心入口,直接修改现有轴的变换矩阵会绕过内部对齐、深度测试等逻辑,导致显示异常。
  2. 正交投影保证:基础矩阵ortho_base确保y、z轴完全对应屏幕的水平、垂直方向,无旋转偏移。
  3. x轴倾斜控制:skew_deg(30, 0)实现x轴斜向下的效果,第一个参数为倾斜角度,可根据需求调整为20°、45°等。
  4. 标签适配:在draw方法中调整x轴标签的旋转角度和对齐方式,避免标签显示错位。

常见问题修复

  • 若之前尝试直接修改ax.get_proj()返回值,会因为Matplotlib的3D渲染流程未适配而失效,自定义投影类能完整覆盖这些逻辑。
  • 如需更精细的x轴缩放比例,可在Affine2D中添加scale变换,比如Affine2D().scale(0.8, 1).skew_deg(30, 0)。

内容的提问来源于stack exchange,提问作者Torben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:32:48