Объединить линии сетки и оси в 3D-графике matplotlib - PullRequest
0 голосов
/ 23 декабря 2018

Я создаю простой 3D-график с использованием matplolib, как этот (python 3.7 matplotlib 3.0):

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
  • Линии осей очень близки к линиям сетки

Я бы хотел, чтобы на каждом из этих мест была только одна линия, чтобы получить более чистую фигуру.Я пытался искать в методах Axes3D, но ничего не смог найти.

1 Ответ

0 голосов
/ 30 июля 2019

Я тоже пытался решить эту проблему и не мог найти решение в Интернете.Вот мое решение:

Существует автоматическое заполнение по краям или 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))
...