Mpld3: ENH: twinx / twiny no funciona.

Creado en 7 may. 2014  ·  17Comentarios  ·  Fuente: mpld3/mpld3

twinx / twiny no funcionan como se esperaba. Sé que esto está en la lista de TODO, pero aún no hay un problema abierto para esto.

Parece que solo se traza el último conjunto de datos. Aquí está el ejemplo oficial.

mpld3 devuelve:
image

tk-agg devuelve:
image

Código para reproducir

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

Comentario más útil

Evité el problema estableciendo un alfa en el fondo del segundo eje.

ax2.patch.set_alpha(0.0)

Todos 17 comentarios

PS en Características, el último punto de viñeta "herramientas de interactividad adicionales, como el cepillado y el zoom de cuadro" probablemente se pueden eliminar, ya que ambos, el zoom de cuadro y el brusing están implementados.

Gracias, imagino que este será un problema abierto durante bastante tiempo ... solucionarlo implicaría algunos cambios muy fundamentales en el paquete.

Por curiosidad: ¿el problema está en d3.js, mplexporter o mpld3?

¿Quizás podría agregarse una advertencia? (Twinx x aún no implementado)

Hmm, o mejor aún, dado que los tics del cuadro de la derecha se recogen, tal vez podría fingir esto dibujando una línea azul escalada en el primero (ejes izquierdos). Lo intentaré mañana ...

Una advertencia sería una buena idea. Debería suceder en mplexporter/exporter.py . No estoy seguro de cuál es la mejor manera de detectar esto en el objeto Axes. ¡Probablemente el primer paso para descubrir cómo implementar esto es descubrir cómo generar una advertencia cuando existe!

twinx() y twiny() dan como resultado la creación de ejes adicionales que tienen la misma ubicación que los ejes originales. Detectar si dos ejes son gemelos no es demasiado difícil:

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

Dado que los dos ejes simplemente están apilados, asumí que todo se pasa a D3, que simplemente dibuja los dos ejes uno encima del otro. Verifiqué esto con un simple complemento y este es de hecho el caso. Tanto el Line2D exponencial como el Line2D sen están presentes en el lado D3. De hecho, la figura del lado D3 tiene dos ejes. Esto también explica por qué los ticks se representan correctamente. No hay nada de los segundos ejes dibujados sobre ellos.

Bien, entonces ambos ejes están dibujados, pero uno está encima del otro. Debido a que tienen un fondo blanco opaco, el contenido de los ejes inferiores está oculto. Además, debido a que los eventos del mouse no se propagan a través de los elementos de los ejes, solo los ejes superiores responden al zoom.

Arreglar esto requerirá una reelaboración del diseño mpld3. Me pregunto cómo matplotlib maneja esto.

Exactamente.

Parece que axes._frameon se usa para controlar el dibujo tanto del parche de fondo como del marco alrededor del parche. Frameon es verdadero para los primeros ejes y falso para los segundos ejes. Si ahora establecemos frameon en True, ya no vemos la línea que pertenece a los primeros ejes:

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

Esto sugiere que este problema está relacionado con el número 186 y que abordar uno también debería ayudar a abordar el otro.

¡Ah, eso es genial! Gracias por investigar eso.

¿Cómo le gustaría abordar este problema? La solución más obvia sería pasar frame_on y modificar el método de dibujo de mpld3_Axes para tener en cuenta si frame_on es Verdadero o Falso.

Al examinar el código, esto implicaría cambios en mplexporter y MPD3Renderer, en el lado de python, y un cambio en mpld3Axes en el lado de javascript.

Sí: mplexporter tendría que actualizarse para pasar por frame_on , y si es False, las líneas asociadas y el color de relleno deben ser transparentes.

Evité el problema estableciendo un alfa en el fondo del segundo eje.

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

permite que aparezcan las líneas, pero las herramientas de desplazamiento, panorámica y zoom aún no funcionan en los ejes inferiores. ¿Existe alguna forma de permitir que las herramientas funcionen en todos los ejes?

A menos que esté muy equivocado, esto sigue siendo un problema. Usando ax2.patch.set_alpha(0.0) puedo ver mis dos parcelas gemelas, pero zoom / pan todavía funciona solo para los ejes superiores. Ambos gráficos cambian, pero solo el eje x y el eje y secundario responden a la nueva escala.

Otro problema que encontré es si intentas usar tres ejes x. El tercero debería estar a la derecha como se describe en este ejemplo , pero no funciona como se supone que debe estar. El tercero anula al segundo. La herramienta de zoom todavía no funciona con el método twinx () para mí. Espero que puedas arreglarlo pronto (si tengo tiempo libre, lo intentaré).

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

@fronchetti este proyecto ya no se mantiene, y no se ha mantenido durante algunos años. Desde el archivo README:

Nota: mpld3 ya no se mantiene de forma activa: es probable que las solicitudes de funciones y los informes de errores no reciban respuesta. Si está interesado en mantener este proyecto, comuníquese con uno de los propietarios del repositorio.

Hay muchas otras opciones de trazado web / portátil para Python: altair, bokeh, bqplot, solo por nombrar algunas. [divulgación: soy un desarrollador central de Bokeh] O si estás interesado en hacerte cargo de este proyecto, te sugiero que envíes un correo electrónico a Jake.

¡Ay! No vi esta información en su sitio web. Vine aquí buscando problemas que pudieran resolver mi problema. Gracias @bryevdv , intentaré otra opción de trazado.

¿Fue útil esta página
0 / 5 - 0 calificaciones