Отрегулируйте расположение этикетки в Axes3D matplotlib - PullRequest
29 голосов
/ 03 апреля 2011

У меня проблемы с метками осей, перекрывающими метки тиков в matplotlib.Я пытался переместить метки «вручную», применяя преобразования или вызывая set_y (), но безрезультатно.

Вот фрагмент, который воспроизводит проблему:

import matplotlib
matplotlib.use("TKAGG")
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d

figure = pyplot.figure()
figure.subplots_adjust(bottom=0.25, top=0.75)
axes = figure.gca(projection='3d')
xLabel = axes.set_xlabel('XXX xxxxxx xxxx x xx x')
yLabel = axes.set_ylabel('YY (y) yyyyyy')
zLabel = axes.set_zlabel('Z zzzz zzz (z)')
plot = axes.plot([1,2,3],[1,2,3])

pyplot.show()

Обратите вниманиеметки x и y сталкиваются с галочками.Могу ли я решить это элегантно?

Ответы [ 6 ]

37 голосов
/ 03 апреля 2011

Я разделяю ваше разочарование. Я работал над этим полчаса и ничего не получил. Документы говорят, что set_xlabel принимает arg labelpad , но я получаю сообщение об ошибке (AttributeError: Неизвестное свойство labelpad)! Установка по факту ничего не делает, на xaxis или w_xaxis.

Вот грубый обходной путь:

import matplotlib
matplotlib.use("TKAGG")
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d

figure = pyplot.figure(figsize=(8,4), facecolor='w')
ax = figure.gca(projection='3d')

xLabel = ax.set_xlabel('\nXXX xxxxxx xxxx x xx x', linespacing=3.2)
yLabel = ax.set_ylabel('\nYY (y) yyyyyy', linespacing=3.1)
zLabel = ax.set_zlabel('\nZ zzzz zzz (z)', linespacing=3.4)
plot = ax.plot([1,2,3],[1,2,3])
ax.dist = 10

pyplot.show()

enter image description here

21 голосов
/ 03 октября 2014

В новых версиях matplotlib это делается следующим образом:

ax.xaxis._axinfo['label']['space_factor'] = 2.8

См. Объяснение здесь:

https://github.com/matplotlib/matplotlib/issues/3610

Протестировано на v1.4, должен работать в версиях> 1.1 я считаю.

16 голосов
/ 10 ноября 2011

Мне действительно нужно чаще следить за StackOverflow. Я текущий сопровождающий mplot3d. Причина, по которой различные приемы, которые обычно работают на обычных 2D-графиках, не работают для 3D-графиков, заключается в том, что mplot3d изначально был написан с жестко заданными значениями по умолчанию. Также были ошибки в том, как mplot3d вычислял угол для рендеринга надписей.

v1.1.0 содержит несколько исправлений для улучшения положения вещей. Я исправил просчет углов меток осей и внес некоторые коррективы в интервал. В следующем выпуске я хотел бы, чтобы трехмерные оси занимали больше, чем стандартное расстояние между осями, поскольку стандартное задание было разработано с учетом того, что метки тиков и метки осей находились бы вне осей, что не относится к mplot3d , Поскольку расстояния в mplot3d определяются относительными пропорциями, из-за меньшего пространства для работы метки сближаются.

Что касается других возможных путей обхода, см. Примечание здесь . Справедливое предупреждение, этот частный словарь не предназначен для того, чтобы быть постоянным решением, а скорее необходимым злом, пока не завершится рефакторинг mplot3d.

Кроме того, v1.1.0 содержит множество обновлений API mplot3d. Пожалуйста, ознакомьтесь с пересмотренной документацией здесь .

9 голосов
/ 08 апреля 2016

Добавьте это для каждой оси, измените число:

axes.yaxis.labelpad=30

Он упоминается в ссылке Адамом Хьюзом как не работающий, но у меня работает.

6 голосов
/ 14 мая 2018

Это изменяет заполнение для всех (x, y, z) меток в одном кадре.Мне больше нравится этот подход:

from matplotlib import rcParams
rcParams['axes.labelpad'] = 20
3 голосов
/ 03 апреля 2011

Как практика проектирования, преобразованный текст не очень разборчивый. Я бы посоветовал вам использовать метки для вашей оси, возможно, с цветовым кодированием. Вот как ты это делаешь в matplotlib

import matplotlib
matplotlib.use("TKAGG")
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d

figure = pyplot.figure()
figure.subplots_adjust(bottom=0.25, top=0.75)
axes = figure.gca(projection='3d')
xLabel = axes.set_xlabel('X', fontsize=14, fontweight='bold', color='b')
yLabel = axes.set_ylabel('Y',fontsize=14, fontweight='bold', color='r')
zLabel = axes.set_zlabel('Z',fontsize=14, fontweight='bold', color='g')


x = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='b')
y = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='r')
z = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='g')

handles, labels = axes.get_legend_handles_labels()
axes.legend((x,y,z),("XXXXXX","YYYYY","ZZZZZZ"),'best')


plot = axes.plot([1,2,3],[1,2,3])


pyplot.show()

Image result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...