Matplotlib:如何缩小3D绘图避免标签超出子图范围
问题
在2D绘图中,使用constrained或tight布局通常足以调整坐标轴大小以适配标签,但对于小型3D绘图,所有默认布局均无法解决标签超出子图范围的问题。尝试查阅transform相关资料想手动缩小坐标轴,但因从未使用过transform,难以理解其应用方式。
请问是否存在缩小3D绘图尺寸以避免标签超出子图范围的方法?
最小可复现代码(MWE)
import numpy as np import matplotlib.pyplot as plt if __name__ == "__main__": x = np.random.uniform(0, 1, 100) y = np.random.uniform(0, 1, 100) z = np.random.uniform(0, 1, 100) fig = plt.figure(facecolor="green", layout="constrained", figsize=(3, 3)) ax = fig.add_subplot(111, projection="3d", proj_type="ortho") ax.scatter(x, y, z) plt.show()

解决方案
以下是几种实用的解决方法:
方法1:手动设置子图位置与尺寸
直接通过ax.set_position()定义子图在画布中的位置和大小,给坐标轴标签留出足够的外围空间。参数为[左边界, 底边界, 宽度, 高度],取值范围均为0-1:
import numpy as np import matplotlib.pyplot as plt if __name__ == "__main__": x = np.random.uniform(0, 1, 100) y = np.random.uniform(0, 1, 100) z = np.random.uniform(0, 1, 100) fig = plt.figure(facecolor="green", figsize=(3, 3)) ax = fig.add_subplot(111, projection="3d", proj_type="ortho") # 缩小子图并居中,留出边距给标签 ax.set_position([0.2, 0.2, 0.6, 0.6]) ax.scatter(x, y, z) plt.show()
方法2:缩小标签字体+调整坐标轴比例
通过缩小坐标轴标签的字体大小,同时用ax.set_box_aspect()固定坐标轴比例,间接让绘图区域适配标签:
import numpy as np import matplotlib.pyplot as plt if __name__ == "__main__": x = np.random.uniform(0, 1, 100) y = np.random.uniform(0, 1, 100) z = np.random.uniform(0, 1, 100) fig = plt.figure(facecolor="green", layout="constrained", figsize=(3, 3)) ax = fig.add_subplot(111, projection="3d", proj_type="ortho") # 设置坐标轴等比例显示 ax.set_box_aspect([1, 1, 1]) # 缩小刻度标签字体 ax.tick_params(axis='both', labelsize=8) ax.scatter(x, y, z) plt.show()
方法3:调整画布边距
使用plt.subplots_adjust()直接调整画布的上下左右边距,为标签腾出空间:
import numpy as np import matplotlib.pyplot as plt if __name__ == "__main__": x = np.random.uniform(0, 1, 100) y = np.random.uniform(0, 1, 100) z = np.random.uniform(0, 1, 100) fig = plt.figure(facecolor="green", figsize=(3, 3)) ax = fig.add_subplot(111, projection="3d", proj_type="ortho") ax.scatter(x, y, z) # 调整边距,数值可根据实际情况微调 plt.subplots_adjust(left=0.2, right=0.8, bottom=0.2, top=0.8) plt.show()
内容的提问来源于stack exchange,提问作者alfonsoSR
相关产品推荐
相关产品推荐

