Правильная установка ограничений по осям в matplotlib 3dplots?

У меня проблема с установкой ограничений для моих 3D-графиков в matplotlib; Я обнаружил, что независимо от того, как я устанавливаю свои ограничения для осей 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()

Получается следующий сюжет:

3D изображение осей

Как видите, предполагается, что пределы должны быть равны x, y, z = {0, 10}, однако трехмерное построение всегда добавляет немного буфера к каждому краю. Кто-нибудь знает, как отключить этот эффект?

Я также использовал plt.xlims(); и ax.axes.set_xlims(), но они дают тот же эффект.


person aarogers    schedule 26.02.2018    source источник
comment
Спасибо ImportanceOfBeingErnest; Я пошел с решением повторяющегося вопроса.   -  person aarogers    schedule 27.02.2018


Ответы (1)


Я думаю, что это сделано намеренно (см., например, 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) 

Лучшее решение, которое я нашел, - это установить галочки вручную, а затем немного масштабировать, чтобы скрыть перекрытие.

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()

Это дает,

введите здесь описание изображения

Это довольно хакерский подход, но его можно было бы сделать более общим (и я всегда в конечном итоге устанавливаю галочки вручную для показателей качества публикации). В качестве альтернативы может быть лучше отключить самую нижнюю линию сетки или скрыть сетку...

person Ed Smith    schedule 26.02.2018
comment
Если вы считаете, что это правильное решение, лучше добавьте его в качестве ответа на дубликат. - person ImportanceOfBeingErnest; 26.02.2018
comment
Хорошее место @ImportanceOfBeingErnest, не нашел этот вопрос. Принятый ответ намного лучше на дубликате, так что нет смысла. - person Ed Smith; 26.02.2018