在matplotlib 3D图中合并网格线和轴

时间:2018-12-23 18:44:54

标签: python matplotlib 3d figure

我正在使用类似(python 3.7 matplotlib 3.0)的matplolib创建一个简单的3D图:

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

def bilinear1(x,y):
    return (1-x)*(1-y)

fig = plt.figure()

ax = plt.axes(projection='3d')

x = np.linspace(0, 1, 100)
y = np.linspace(0, 1, 100)
X, Y = np.meshgrid(x,y)

Z = bilinear1(X,Y)

ax.set_xticks([0, 1]);ax.set_yticks([0, 1]);ax.set_zticks([0, 1])
ax.set_xlim(0,1); ax.set_ylim(0,1); ax.set_zlim(0,1)
ax.set_xlabel('x'); ax.set_ylabel('y'); ax.set_zlabel('z')

ax.plot_surface(X,Y,Z, rstride=10, cstride=10)

这将创建以下图形graph

情节很好,但存在以下问题:

  • 在x = 0 z = 0,y = 1 z = 0和x = 0 y = 1时有2条网格线
  • 轴线非常靠近网格线

我希望每个地方只有一条线,以产生一个简洁的图形。我尝试查看Axes3D方法,但找不到任何东西。

1 个答案:

答案 0 :(得分:1)

我也在尝试解决此问题,并且无法在线找到解决方案。这是我的解决方案:

在边缘或matplotlib 3d图上有自动填充。它似乎恰好是轴范围的1/50,因此,使用网格线作为一个不错的盒子,请尝试如下操作。

#Get the axis limits
xmin,xmax = axs.get_xlim()
ymin,ymax = axs.get_ylim()
zmin,zmax = axs.get_zlim()

#Find the amount of padding
xpad = (xmax-xmin)/50.0
ypad = (ymax-ymin)/50.0
zpad = (zmax-zmin)/50.0

#Set the ticks so they lay on top of eachother and make a nice box
axs.set_xticks((xmin-xpad,xmax+xpad)) 
axs.set_yticks((ymin-ypad,ymax+ypad))
axs.set_zticks((zmin-zpad,zmax+zpad))

#Change the labels to match the plot range
axs.set_xticklabels((xmin,xmax))
axs.set_yticklabels((ymin,ymax))
axs.set_zticklabels((zmin,zmax))