Подтвердить что ты не робот

Отрегулируйте расположение меток в Axes3D matplotlib

У меня возникают проблемы с ярлыками осей, перекрывающими метки меток в 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 сталкиваются с тиками. Могу ли я решить эту проблему?

4b9b3361

Ответ 1

Я разделяю ваше разочарование. Я работал над ним в течение полутора часов и никуда не уходил. Документы говорят, что set_xlabel принимает указатель arg но я получаю сообщение об ошибке (AttributeError: Unknown property 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

Ответ 2

В новых версиях matplotlib вот как это сделать:

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

axes.yaxis.labelpad=30

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

Ответ 5

Как практика проектирования, преобразованный текст не очень читабельен. Я предлагаю вам использовать ярлыки для вашей оси, возможно, закодированные цвета. Так вы делаете это в 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

Ответ 6

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

from matplotlib import rcParams
rcParams['axes.labelpad'] = 20