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

Вы можете обмануть что-то;)

В принципе, используйте псевдоэлемент :before для дочернего div с его одинаковым размером;

, когда вы наводите указатель на дочерний div , увеличьте псевдоэлемент :before, чтобы покрыть область div отца; это приведет к падению эффекта отца div hover, а затем вернуться в исходное состояние. Точная комбинация z-индекса также задействована.

Демо: http://jsfiddle.net/gFu8h/

blockquote>

CSS Dark Magic (tm)

.parent {
    width:100px;
    height:100px;
    padding:50px;
    transition:background-color 1s;
    background:#3D6AA2;    
    position: relative;
    z-index: 1;
}

.parent:hover{
    background:#FFF;    
}


.child {
    height:100px;
    width:100px;
    background:#355E95;
    transition:background-color 1s;
    position: relative;
}

.child:hover {    
    background:#000;
}

.child:before{
    content: '';
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;        
    z-index: -1;
    transition:background-color 1s;
}

.child:hover:before{
    top: -50px;
    bottom: -50px;
    left: -50px;
    right: -50px;     
    background:#3D6AA2;    
}

29
задан Robert Harvey 13 November 2013 в 18:26
поделиться

7 ответов

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

37
ответ дан Paul 13 November 2013 в 18:26
поделиться

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

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

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

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

16
ответ дан Ben Root 13 November 2013 в 18:26
поделиться

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

axes.yaxis.labelpad=30

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

8
ответ дан TNT 13 November 2013 в 18:26
поделиться

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

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

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

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

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

20
ответ дан Adam Hughes 13 November 2013 в 18:26
поделиться

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

from matplotlib import rcParams
rcParams['axes.labelpad'] = 20
5
ответ дан tamasgal 13 November 2013 в 18:26
поделиться

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

3
ответ дан fabrizioM 13 November 2013 в 18:26
поделиться

Можно использовать labelpad после этого, Вы выводите свою фигуру на печать:

axes = fig.gca(projection='3d')
axes.xaxis.labelpad=20
axes.yaxis.labelpad=20
axes.zaxis.labelpad=20

Это могло бы заставить подписи оси выходить за пределы 3D графика, таким образом, необходимо скорректировать расстояние с помощью dist метод:

ax.dist = 13
0
ответ дан 27 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: