正确设置 3d 图中的轴限制

aar*_*ers 7 python axis matplotlib mplot3d matplotlib-3d

我在 matplotlib 中为 3d 图设置限制时遇到问题;我发现无论我如何设置 x、y 和 z 轴的限制,3dplots 的绘图例程都会添加额外的缓冲区。

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

fig = plt.figure() 
ax = fig.add_subplot(111,projection='3d') 
ax.axes.set_xlim3d(left=0, right=10) 
ax.axes.set_ylim3d(bottom=0, top=10) 
ax.axes.set_zlim3d(bottom=0, top=10) 
plt.show()
Run Code Online (Sandbox Code Playgroud)

这会产生以下图:

3d 轴图像

正如您所看到的,限制应该位于 x, y, z = {0, 10},但是 3D 绘图总是向每个边缘添加一点缓冲区。有谁知道如何关闭此效果?

我还使用过 plt.xlims(); 和 ax.axes.set_xlims() 但它们产生相同的效果。

Ed *_*ith 10

我认为这是故意的(参见例如this),如果你尝试绘图,ax.axes.set_xlim3d(left=0.000001, right=9.9999999)那么你的图形上不会显示0或10。

在此输入图像描述

即使使数字尽可能接近也不起作用,例如

eps = 1e-16
ax.axes.set_xlim3d(left=0.-eps, right=10+eps)
ax.axes.set_ylim3d(bottom=0.-eps, top=10+eps) 
ax.axes.set_zlim3d(bottom=0.-eps, top=10+eps) 
Run Code Online (Sandbox Code Playgroud)

我发现的最佳解决方案是手动设置刻度,然后稍微缩放,以便隐藏重叠。

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

fig = plt.figure() 
ax = fig.add_subplot(111,projection='3d') 

ax.set_xticks([0,2,4,6,8,10])
ax.set_yticks([0,2,4,6,8,10])
ax.set_zticks([0,2,4,6,8,10])

ax.axes.set_xlim3d(left=0.2, right=9.8) 
ax.axes.set_ylim3d(bottom=0.2, top=9.8) 
ax.axes.set_zlim3d(bottom=0.2, top=9.8) 

plt.show()
Run Code Online (Sandbox Code Playgroud)

这给出了,

在此输入图像描述

这是相当老套的,但可以变得更通用(而且我总是最终手动设置出版物质量数据的刻度)。或者,最好关闭最低的网格线或隐藏网格......