matplotlib绘制3D图时出现归一化刻度边框的原因及解决方法问询
问题成因
你看到的带0-1刻度的异常边框是创建画布时先生成的默认2D坐标轴残留。
调用plt.subplots()时会默认在画布上创建一个普通2D坐标轴对象,后续调用fig.gca(projection='3d')是在同一个画布位置叠加了一个新的3D坐标轴,底层的2D坐标轴没有被隐藏,其自带的边框和默认0-1范围的刻度就会显示在3D图的外围。
解决方法
方案1:创建子图时直接指定3D投影(更推荐,适合同时放置2D、3D子图的场景)
不需要先创建默认2D轴再替换,创建子图时直接给对应子图指定projection='3d'参数即可,示例代码如下:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D x = np.linspace(0,10) y = np.linspace(0,10) z = np.linspace(0,10) # ------------- 单张3D图写法 --------------- fig = plt.figure(figsize = (9,6)) ax = fig.add_subplot(projection='3d') ax.plot(np.sin(x), np.cos(y), z) plt.show()
如果需要同时放置2D和3D子图,按如下写法创建即可,不会产生残留边框:
# ------------- 并列2D+3D子图写法 --------------- fig = plt.figure(figsize = (14,6)) # 第一个子图为2D ax1 = fig.add_subplot(121) # 第二个子图为3D ax2 = fig.add_subplot(122, projection='3d') # 2D子图绘图 ax1.plot(x, np.sin(x)) # 3D子图绘图 ax2.plot(np.sin(x), np.cos(y), z) plt.show()
方案2:手动隐藏原有2D坐标轴
如果不想修改原有创建画布的逻辑,可以在创建3D坐标轴后把底层的2D坐标轴设置为不可见:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D x = np.linspace(0,10) y = np.linspace(0,10) z = np.linspace(0,10) # ------------- Figure --------------- fig, ax_2d = plt.subplots(figsize = (9,6)) # 隐藏原有2D轴 ax_2d.set_visible(False) ax = fig.gca(projection='3d') ax.plot(np.sin(x), np.cos(y), z) plt.show()
内容的提问来源于stack exchange,提问作者Andersyes
相关产品推荐
相关产品推荐

