如何修正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()
关键修正说明
- 自定义投影类:必须继承
ProjectionBase并实现get_proj方法,这是Matplotlib 3D渲染的核心入口,直接修改现有轴的变换矩阵会绕过内部对齐、深度测试等逻辑,导致显示异常。 - 正交投影保证:基础矩阵
ortho_base确保y、z轴完全对应屏幕的水平、垂直方向,无旋转偏移。 - x轴倾斜控制:
skew_deg(30, 0)实现x轴斜向下的效果,第一个参数为倾斜角度,可根据需求调整为20°、45°等。 - 标签适配:在
draw方法中调整x轴标签的旋转角度和对齐方式,避免标签显示错位。
常见问题修复
- 若之前尝试直接修改
ax.get_proj()返回值,会因为Matplotlib的3D渲染流程未适配而失效,自定义投影类能完整覆盖这些逻辑。 - 如需更精细的x轴缩放比例,可在
Affine2D中添加scale变换,比如Affine2D().scale(0.8, 1).skew_deg(30, 0)。
内容的提问来源于stack exchange,提问作者Torben
相关产品推荐
相关产品推荐

