You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何调整Matplotlib Axes3D中的坐标轴位置?

调整Matplotlib 3D曲面图坐标轴位置的解决方案

我明白你想要把默认的框式3D坐标轴改成类似笛卡尔坐标系的样式,让三个轴交汇在原点对吧?之前用xaxis.set_ticks_position('left')没效果是因为这个方法是给2D坐标轴设计的,3D轴的结构和设置逻辑完全不同,咱们换个思路来实现:

核心思路

  1. 关闭默认的框架式坐标轴,避免干扰
  2. 手动绘制从原点出发的x、y、z三条坐标轴
  3. 手动放置刻度标签到对应位置,替代默认的框上刻度

修改后的完整代码

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

def f(x,y) :
    return -x**2 - y**2

X = np.arange(-1, 1, 0.02)
Y = np.arange(-1, 1, 0.02)
X, Y = np.meshgrid(X, Y)
Z = f(X, Y)

# 绘制3D曲面
ax.plot_surface(X, Y, Z, alpha=0.5)

# 关闭默认的框架坐标轴和网格
ax.set_axis_off()

# 手动绘制三条坐标轴(从原点延伸到对应极值)
# X轴:从(-1,0,0)到(1,0,0)
ax.plot([-1, 1], [0, 0], [0, 0], color='black')
# Y轴:从(0,-1,0)到(0,1,0)
ax.plot([0, 0], [-1, 1], [0, 0], color='black')
# Z轴:从(0,0,-2)到(0,0,0)
ax.plot([0, 0], [0, 0], [-2, 0], color='black')

# 手动添加刻度标签,位置对应坐标轴端点
# X轴刻度
ax.text(1, 0, 0, '1', fontsize=10, ha='center', va='top')
ax.text(-1, 0, 0, '-1', fontsize=10, ha='center', va='top')
# Y轴刻度
ax.text(0, 1, 0, '1', fontsize=10, ha='left', va='center')
ax.text(0, -1, 0, '-1', fontsize=10, ha='right', va='center')
# Z轴刻度
ax.text(0, 0, 0, '0', fontsize=10, ha='right', va='bottom')
ax.text(0, 0, -2, '-2', fontsize=10, ha='right', va='top')

# 调整视角,让坐标轴显示更贴合期望效果
ax.view_init(elev=20, azim=-30)

plt.show()

关键细节说明

  • ax.set_axis_off():彻底关闭默认的框架轴、网格和背景,只保留我们手动绘制的内容
  • 手动绘制坐标轴用ax.plot(),传入三个维度的坐标数组,确保线条从原点出发到目标端点
  • ax.text()用来放置刻度标签,通过ha(水平对齐)和va(垂直对齐)参数调整标签位置,让它刚好贴在坐标轴端点
  • ax.view_init()可以调整视角,让坐标轴的呈现更接近你想要的效果,你可以根据需求修改elev(仰角)和azim(方位角)数值

这样调整后,就能得到你期望的那种坐标轴交汇于原点的简洁样式啦~

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

火山引擎 最新活动