Mpld3: ENH: twinx / twiny не работает.

Созданный на 7 мая 2014  ·  17Комментарии  ·  Источник: mpld3/mpld3

twinx / twiny не работают должным образом. Я знаю, что это есть в списке TODO, но пока нет открытых проблем.

Кажется, нанесен только последний набор данных. Вот официальный пример.

mpld3 возвращает:
image

tk-agg возвращает:
image

Код для воспроизведения

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import mpld3
mpld3.enable_notebook()

fig, ax1 = plt.subplots()
t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label and tick labels match the line color.
ax1.set_ylabel('exp', color='b')
for tl in ax1.get_yticklabels():
    tl.set_color('b')


ax2 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
ax2.plot(t, s2, 'r.')
ax2.set_ylabel('sin', color='r')
for tl in ax2.get_yticklabels():
    tl.set_color('r')
plt.show()

Самый полезный комментарий

Я избежал этой проблемы, установив альфа-канал на фоне второй оси.

ax2.patch.set_alpha(0.0)

Все 17 Комментарий

PS в разделе « Возможности» последний пункт маркера «дополнительные интерактивные инструменты, такие как кисть и масштабирование прямоугольником», вероятно, можно удалить, поскольку реализованы и масштабирование, и масштабирование.

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

Из любопытства: проблема в d3.js, mplexporter или mpld3?

Может быть, можно добавить предупреждение? (Twinx x еще не реализован)

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

Предупреждение было бы хорошей идеей. Это должно произойти в mplexporter/exporter.py . Я не уверен, как лучше всего обнаружить это в объекте Axes. Вероятно, первый шаг в выяснении того, как это реализовать, - это выяснить, как вывести предупреждение, когда оно существует!

twinx() и twiny() приводят к созданию дополнительных осей, которые имеют то же расположение, что и исходные оси. Определить, являются ли две оси близнецами, не так уж сложно:

import numpy as np
import matplotlib.pyplot as plt


fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)

t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label and tick labels match the line color.
ax1.set_ylabel('exp', color='b')
for tl in ax1.get_yticklabels():
    tl.set_color('b')


ax3 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
ax3.plot(t, s2, 'r.')
ax3.set_ylabel('sin', color='r')
for tl in ax3.get_yticklabels():
    tl.set_color('r')

print ax1.get_shared_x_axes().joined(ax1, ax2)
print ax1.get_shared_x_axes().joined(ax1, ax3)

print ax2.get_shared_x_axes().joined(ax2, ax1)
print ax2.get_shared_x_axes().joined(ax2, ax3)

print ax3.get_shared_x_axes().joined(ax3, ax1)
print ax3.get_shared_x_axes().joined(ax3, ax2)

plt.show()

Учитывая, что две оси просто сложены, я предположил, что все передается в D3, который просто рисует две оси друг над другом. Я проверил это с помощью простого плагина, и это действительно так. И экспонента Line2D, и sin Line2D присутствуют на стороне D3. Фактически, фигура на стороне D3 имеет две оси. Это также объясняет, почему галочки отображаются правильно. Над ними ничего не нарисовано из вторых осей.

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

Чтобы исправить это, потребуется переделать компоновку mpld3. Интересно, как с этим справляется сам matplotlib?

Точно.

Похоже, что axes._frameon используется для управления рисованием как фонового патча, так и рамки вокруг патча. Frameon истинен для первых осей и ложен для вторых осей. Если теперь установить для frameon значение True, мы больше не увидим линию, принадлежащую первым осям:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label and tick labels match the line color.
ax1.set_ylabel('exp', color='b')
for tl in ax1.get_yticklabels():
    tl.set_color('b')

ax2 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
sin = ax2.plot(t, s2, 'r.')
ax2.set_ylabel('sin', color='r')
for tl in ax2.get_yticklabels():
    tl.set_color('r')

print ax1.get_frame_on()
print ax2.get_frame_on()

ax2.set_frame_on(True)

plt.show()

Это говорит о том, что эта проблема связана с № 186 и что решение одной должно также помочь в решении другой.

Ах - это здорово! Спасибо, что вникнули в это.

Как бы вы хотели решить эту проблему? Наиболее очевидным решением было бы передать frame_on и изменить метод рисования mpld3_Axes, чтобы учесть, имеет ли frame_on значение True или False.

При просмотре кода это повлечет за собой изменения в mplexporter и MPD3Renderer на стороне Python и изменение на mpld3Axes на стороне javascript.

Да: mplexporter должен быть обновлен, чтобы проходить через frame_on , и если он ложен, соответствующие линии и цвет заливки должны быть прозрачными.

Я избежал этой проблемы, установив альфа-канал на фоне второй оси.

ax2.patch.set_alpha(0.0)
ax2.patch.set_alpha(0.0)

позволяет отображать линии, но инструменты наведения, панорамирования и масштабирования по-прежнему не работают на нижних осях. Есть ли способ разрешить инструментам работать по всем осям?

Если я не ошибаюсь, это все еще проблема. Используя ax2.patch.set_alpha(0.0) я могу видеть оба моих двойных графика, но масштабирование / панорамирование по-прежнему работает только для верхних осей. Оба графика изменяются, но только ось x и вторичная ось y реагируют на новое масштабирование.

Еще одна проблема, которую я обнаружил, заключается в том, что вы пытаетесь использовать три оси абсцисс. Третий должен быть справа, как описано в этом примере , но он не работает так, как должен. Третье преобладает над вторым. Инструмент масштабирования все еще не работает с методом twinx () для меня. Надеюсь, вы скоро это исправите (если у меня будет свободное время, я постараюсь).

captura de tela de 2017-09-10 01-21-32

@fronchetti этот проект больше не поддерживается, и не поддерживался в течение нескольких лет. Из README:

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

Для Python существует множество других вариантов построения веб-страниц / блокнотов: altair, bokeh, bqplot и многие другие. [раскрытие информации: я основной разработчик Bokeh] Или, если вы заинтересованы в том, чтобы стать владельцем этого проекта, я бы посоветовал написать Джейку электронное письмо.

Ой! Я не видел этой информации на их сайте. Я пришел сюда в поисках проблем, которые могли бы решить мою проблему. Спасибо @bryevdv , попробую другой вариант черчения.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги