Descripción general del conjunto de herramientas de axisartist #

El tutorial del conjunto de herramientas de axisartist.

Advertencia

axisartist usa una clase Axes personalizada (derivada de la clase Axes original de Matplotlib). Como efecto secundario, algunos comandos (en su mayoría relacionados con ticks) no funcionan.

El axisartist contiene una clase Axes personalizada que está diseñada para admitir cuadrículas curvilíneas (por ejemplo, el sistema de coordenadas mundial en astronomía). A diferencia de la clase Axes original de Matplotlib que usa Axes.xaxis y Axes.yaxis para dibujar ticks, ticklines, etc., axisartist usa un artista especial (AxisArtist) que puede manejar ticks, ticklines, etc. para sistemas de coordenadas curvos.

../../_images/sphx_glr_demo_floating_axis_001.png

Dado que utiliza artistas especiales, es posible que algunos comandos de Matplotlib que funcionan en Axes.xaxis y Axes.yaxis no funcionen.

artista del eje #

El módulo axisartist proporciona una clase Axes personalizada (y muy experimental), en la que cada eje (izquierdo, derecho, superior e inferior) tiene un artista asociado independiente que es responsable de dibujar la línea del eje, los ticks, las etiquetas de ticks y las etiquetas. También puede crear su propio eje, que puede pasar por una posición fija en las coordenadas de los ejes, o una posición fija en las coordenadas de los datos (es decir, el eje flota cuando cambia el límite de vista).

La clase de ejes, por defecto, tiene sus ejes x e y invisibles, y tiene 4 artistas adicionales que son responsables de dibujar las columnas de los 4 ejes en "izquierda", "derecha", "abajo" y "arriba". Se accede a ellos como ax.axis["left"], ax.axis["right"], etc., es decir, ax.axis es un diccionario que contiene artistas (tenga en cuenta que ax.axis sigue siendo un método invocable y se comporta como un método Axes.axis original en Matplotlib).

Para crear un eje,

import mpl_toolkits.axisartist as AA
fig = plt.figure()
fig.add_axes([0.1, 0.1, 0.8, 0.8], axes_class=AA.Axes)

o para crear una subtrama

fig.add_subplot(111, axes_class=AA.Axes)
# Given that 111 is the default, one can also do
fig.add_subplot(axes_class=AA.Axes)

Por ejemplo, puede ocultar los lomos derecho y superior usando:

ax.axis["right"].set_visible(False)
ax.axis["top"].set_visible(False)
../../_images/sphx_glr_simple_axisline3_001.png

También es posible añadir un eje horizontal. Por ejemplo, puede tener un eje horizontal en y=0 (en coordenadas de datos).

ax.axis["y=0"] = ax.new_floating_axis(nth_coord=0, value=0)
../../_images/sphx_glr_simple_axisartist1_001.png

O un eje fijo con algún desplazamiento

# make new (right-side) yaxis, but with some offset
ax.axis["right2"] = ax.new_fixed_axis(loc="right", offset=(20, 0))

artista del eje con ParasiteAxes #

La mayoría de los comandos en el kit de herramientas axes_grid1 pueden tomar un argumento de palabra clave axes_class, y los comandos crean un eje de la clase dada. Por ejemplo, para crear una trama secundaria anfitriona con axisartist.Axes,

import mpl_toolkits.axisartist as AA
from mpl_toolkits.axes_grid1 import host_subplot

host = host_subplot(111, axes_class=AA.Axes)

Aquí hay un ejemplo que usa ParasiteAxes.

../../_images/sphx_glr_demo_parasite_axes2_001.png

Cuadrícula curvilínea #

La motivación detrás del módulo AxisArtist es admitir una cuadrícula curvilínea y marcas.

../../_images/sphx_glr_demo_curvelinear_grid_001.png

Ejes flotantes #

AxisArtist también admite ejes flotantes cuyos ejes exteriores se definen como ejes flotantes.

../../_images/sphx_glr_demo_floating_axes_001.png

espacio de nombres del artista del eje #

El espacio de nombres axisartist incluye una implementación de Axes derivada. La mayor diferencia es que los artistas responsables de dibujar la línea del eje, los ticks, la etiqueta de tick y las etiquetas de los ejes están separados de la clase Axis de Matplotlib, que son mucho más que los artistas del Matplotlib original. Este cambio estuvo fuertemente motivado para apoyar la cuadrícula curvilínea. Aquí hay algunas cosas en las que mpl_toolkits.axisartist.Axes es diferente de los ejes originales de Matplotlib.

  • Los elementos del eje (línea del eje (columna vertebral), marcas, etiqueta de marca y etiquetas del eje) se dibujan mediante una instancia de AxisArtist. A diferencia de Axis, los ejes izquierdo, derecho, superior e inferior son dibujados por artistas independientes. Y cada uno de ellos puede tener una ubicación de marca diferente y etiquetas de marca diferentes.

  • las líneas de cuadrícula son dibujadas por una instancia de Gridlines. El cambio se debió a que, en coordenadas curvilíneas, una línea de cuadrícula no puede cruzar líneas de eje (es decir, sin marcas asociadas). En la clase Axes original, las líneas de cuadrícula están vinculadas a marcas.

  • las líneas de verificación se pueden rotar si es necesario (es decir, a lo largo de las líneas de cuadrícula)

En resumen, todos estos cambios fueron para apoyar

  • una cuadrícula curvilínea.

  • un eje flotante

../../_images/sphx_glr_demo_floating_axis_001.png

La clase mpl_toolkits.axisartist.Axes define un atributo de eje , que es un diccionario de instancias de AxisArtist. De forma predeterminada, el diccionario tiene 4 instancias de AxisArtist, responsables de dibujar los ejes izquierdo, derecho, inferior y superior.

Los atributos xaxis y yaxis todavía están disponibles, sin embargo, están configurados como no visibles. Como se utilizan artistas separados para renderizar el eje, es posible que algunos métodos relacionados con el eje en Matplotlib no tengan efecto. Además de las instancias de AxisArtist, mpl_toolkits.axisartist.Axes tendrá el atributo de líneas de cuadrícula (Gridlines), que obviamente dibuja líneas de cuadrícula.

Tanto en AxisArtist como en Gridlines, el cálculo de la marca y la ubicación de la cuadrícula se delega a una instancia de la clase GridHelper. La clase mpl_toolkits.axisartist.Axes usa GridHelperRectlinear como asistente de cuadrícula. La clase GridHelperRectlinear es un contenedor alrededor del eje x y el eje y de los ejes originales de Matplotlib, y estaba destinado a funcionar como la forma en que funcionan los ejes originales de Matplotlib. Por ejemplo, los cambios de ubicación de marca con el método set_ticks, etc. deberían funcionar como se espera. Pero el cambio en las propiedades del artista (p. ej., color) no funcionará en general, aunque se ha hecho un esfuerzo para que se respeten algunos atributos que cambian con frecuencia (color, etc.).

Artista del Eje #

AxisArtist puede considerarse como un artista contenedor con los siguientes atributos que dibujarán marcas, etiquetas, etc.

  • línea

  • marcas_principales, etiquetas_marcas_principales

  • minor_ticks, minor_ticklabels

  • texto compensado

  • etiqueta

línea #

Derivado de la clase Line2D. Responsable de dibujar una línea espinal (?).

major_ticks, minor_ticks #

Derivado de la clase Line2D. Tenga en cuenta que las marcas son marcadores.

major_ticklabels, minor_ticklabels #

Derivado de Texto. Tenga en cuenta que no es una lista de artistas de texto, sino un solo artista (similar a una colección).

etiqueta del eje #

Derivado de Texto.

Artistas Axis predeterminados #

De forma predeterminada, se definen los siguientes artistas del eje:

ax.axis["left"], ax.axis["bottom"], ax.axis["right"], ax.axis["top"]

Las etiquetas de marca y la etiqueta del eje de la parte superior y del eje derecho están configuradas como no visibles.

Por ejemplo, si desea cambiar los atributos de color de major_ticklabels del eje x inferior

ax.axis["bottom"].major_ticklabels.set_color("b")

Del mismo modo, para hacer invisibles las etiquetas

ax.axis["bottom"].major_ticklabels.set_visible(False)

AxisArtist proporciona un método auxiliar para controlar la visibilidad de las marcas, etiquetas de marcas y etiquetas. Para hacer ticklabel invisible,

ax.axis["bottom"].toggle(ticklabels=False)

Para hacer que todos los ticks, etiquetas de ticks y etiquetas (eje) sean invisibles

ax.axis["bottom"].toggle(all=False)

Para apagar todo pero garrapatas encendidas

ax.axis["bottom"].toggle(all=False, ticks=True)

Para activar todo menos la etiqueta (eje) desactivada

ax.axis["bottom"].toggle(all=True, label=False)

El método __getitem__ de ax.axis puede tomar varios nombres de eje. Por ejemplo, para activar las etiquetas de los ejes "superior" y "derecho",

ax.axis["top", "right"].toggle(ticklabels=True)

Tenga en cuenta que devuelve un objeto proxy simple que traduce el código anterior a algo como a continuación.ax.axis["top", "right"]

for n in ["top", "right"]:
    ax.axis[n].toggle(ticklabels=True)

Por lo tanto, cualquier valor devuelto en el bucle for se ignora. Y no deberías usarlo más que como un simple método.

Al igual que la lista que indexa ":" significa todos los elementos, es decir,

ax.axis[:].major_ticks.set_color("r")

cambia el color de la marca en todos los ejes.

Cómo #

  1. Cambiar la ubicación y la etiqueta de las marcas.

Igual que los ejes originales de Matplotlib:

ax.set_xticks([1, 2, 3])
  1. Cambiar las propiedades del eje como el color, etc.

Cambie las propiedades de los artistas apropiados. Por ejemplo, para cambiar el color de las etiquetas de verificación:

ax.axis["left"].major_ticklabels.set_color("r")
  1. Para cambiar los atributos de varios ejes:

    ax.axis["left", "bottom"].major_ticklabels.set_color("r")
    

    o para cambiar los atributos de todos los ejes:

    ax.axis[:].major_ticklabels.set_color("r")
    
  2. Para cambiar el tamaño del tick (longitud), debe usar el método axis.major_ticks.set_ticksize. Para cambiar la dirección de los ticks (los ticks están en dirección opuesta a las etiquetas de ticks por defecto), use el método axis.major_ticks.set_tick_out.

    Para cambiar el pad entre ticks y ticklabels, use el método axis.major_ticklabels.set_pad.

    Para cambiar el pad entre ticklabels y la etiqueta del eje, método axis.label.set_pad.

Rotación y alineación de TickLabels #

Esto también es bastante diferente de Matplotlib estándar y puede ser confuso. Cuando desee rotar las etiquetas, primero considere usar el método "set_axis_direction".

ax1.axis["left"].major_ticklabels.set_axis_direction("top")
ax1.axis["right"].label.set_axis_direction("left")
../../_images/sphx_glr_simple_axis_direction01_001.png

El parámetro para set_axis_direction es uno de ["izquierda", "derecha", "abajo", "arriba"].

Debe comprender algún concepto subyacente de las direcciones.

  • Hay una dirección de referencia que se define como la dirección de la línea del eje con coordenada creciente. Por ejemplo, la dirección de referencia del eje x izquierdo es de abajo hacia arriba.

    La dirección, el ángulo del texto y las alineaciones de los ticks, ticklabels y axis-label se determinan con respecto a la dirección de referencia

  • label_direction y ticklabel_direction son el lado derecho (+) de la dirección de referencia o el lado izquierdo (-).

  • las marcas se dibujan por defecto en la dirección opuesta a las etiquetas de las marcas.

  • la rotación de texto de ticklabels y label se determina en referencia a ticklabel_direction o label_direction , respectivamente. La rotación de ticklabels y label está anclada.

../../_images/sphx_glr_axis_direction_001.png

Por otro lado, existe un concepto de "axis_direction". Esta es una configuración predeterminada de las propiedades anteriores para cada eje "inferior", "izquierdo", "superior" y "derecho".

?

?

izquierda

abajo

Correcto

parte superior

etiqueta del eje

dirección

'-'

'+'

'+'

'-'

etiqueta del eje

rotación

180

0

0

180

etiqueta del eje

Virginia

centro

parte superior

centro

abajo

etiqueta del eje

decir ah

Correcto

centro

Correcto

centro

etiqueta

dirección

'-'

'+'

'+'

'-'

etiquetas de garrapatas

rotación

90

0

-90

180

etiqueta

decir ah

Correcto

centro

Correcto

centro

etiqueta

Virginia

centro

base

centro

base

Y, 'set_axis_direction("top")' significa ajustar la rotación del texto, etc., para configuraciones adecuadas para el eje "superior". El concepto de dirección del eje puede ser más claro con un eje curvo.

../../_images/sphx_glr_demo_axis_direction_001.png

La dirección_eje se puede ajustar en el nivel de AxisArtist o en el nivel de sus artistas secundarios, es decir, ticks, ticklabels y axis-label.

ax1.axis["left"].set_axis_direction("top")

cambia axis_direction de todos los artistas asociados con el eje "izquierdo", mientras que

ax1.axis["left"].major_ticklabels.set_axis_direction("top")

cambia la dirección del eje de solo las etiquetas principales. Tenga en cuenta que set_axis_direction en el nivel de AxisArtist cambia ticklabel_direction y label_direction, mientras que cambiar axis_direction de ticks, ticklabels y axis-label no los afecta.

Si desea hacer marcas hacia afuera y marcas dentro de los ejes, use el método invert_ticklabel_direction.

ax.axis[:].invert_ticklabel_direction()

Un método relacionado es "set_tick_out". Hace ticks hacia afuera (de hecho, hace ticks en la dirección opuesta a la dirección predeterminada).

ax.axis[:].major_ticks.set_tick_out(True)
../../_images/sphx_glr_simple_axis_direction03_001.png

Entonces, en resumen,

  • Métodos de AxisArtist

    • set_axis_direction: "izquierda", "derecha", "abajo" o "arriba"

    • set_ticklabel_direction: "+" o "-"

    • set_axislabel_direction: "+" o "-"

    • invert_ticklabel_direction

  • Métodos de ticks (major_ticks y minor_ticks)

    • set_tick_out: Verdadero o Falso

    • set_ticksize: tamaño en puntos

  • Métodos de TickLabels (major_ticklabels y minor_ticklabels)

    • set_axis_direction: "izquierda", "derecha", "abajo" o "arriba"

    • set_rotation: ángulo con respecto a la dirección de referencia

    • set_ha y set_va: ver más abajo

  • Métodos de AxisLabels (etiqueta)

    • set_axis_direction: "izquierda", "derecha", "abajo" o "arriba"

    • set_rotation: ángulo con respecto a la dirección de referencia

    • set_ha y set_va

Ajuste de la alineación de las etiquetas de verificación #

La alineación de TickLabels se trata de forma especial. Vea abajo

../../_images/sphx_glr_demo_ticklabel_alignment_001.png

Almohadilla de ajuste #

Para cambiar el pad entre ticks y ticklabels

ax.axis["left"].major_ticklabels.set_pad(10)

O ticklabels y axis-label

ax.axis["left"].label.set_pad(10)
../../_images/sphx_glr_simple_axis_pad_001.png

GridHelper #

Para definir realmente una coordenada curvilínea, debe usar su propio asistente de cuadrícula. Se proporciona una versión generalizada de la clase auxiliar de cuadrícula y esta clase debería ser suficiente en la mayoría de los casos. Un usuario puede proporcionar dos funciones que definen una transformación (y su par inverso) de la coordenada curva a la coordenada de la imagen (rectilínea). Tenga en cuenta que, si bien las marcas y las cuadrículas se dibujan para coordenadas curvas, la transformación de datos de los propios ejes (ax.transData) sigue siendo una coordenada rectilínea (imagen).

from mpl_toolkits.axisartist.grid_helper_curvelinear \
     import GridHelperCurveLinear
from mpl_toolkits.axisartist import Axes

# from curved coordinate to rectlinear coordinate.
def tr(x, y):
    x, y = np.asarray(x), np.asarray(y)
    return x, y-x

# from rectlinear coordinate to curved coordinate.
def inv_tr(x, y):
    x, y = np.asarray(x), np.asarray(y)
    return x, y+x

grid_helper = GridHelperCurveLinear((tr, inv_tr))

fig.add_subplot(axes_class=Axes, grid_helper=grid_helper)

En su lugar, puede usar la instancia Transform de Matplotlib (pero se debe definir una transformación inversa). A menudo, el rango de coordenadas en un sistema de coordenadas curvo puede tener un rango limitado o puede tener ciclos. En esos casos, se requiere una versión más personalizada de Grid Helper.

import mpl_toolkits.axisartist.angle_helper as angle_helper

# PolarAxes.PolarTransform takes radian. However, we want our coordinate
# system in degree
tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform()

# extreme finder: find a range of coordinate.
# 20, 20: number of sampling points along x, y direction
# The first coordinate (longitude, but theta in polar)
#   has a cycle of 360 degree.
# The second coordinate (latitude, but radius in polar)  has a minimum of 0
extreme_finder = angle_helper.ExtremeFinderCycle(20, 20,
                                                 lon_cycle = 360,
                                                 lat_cycle = None,
                                                 lon_minmax = None,
                                                 lat_minmax = (0, np.inf),
                                                 )

# Find a grid values appropriate for the coordinate (degree,
# minute, second). The argument is a approximate number of grids.
grid_locator1 = angle_helper.LocatorDMS(12)

# And also uses an appropriate formatter.  Note that the acceptable Locator
# and Formatter classes are different than that of Matplotlib's, and you
# cannot directly use Matplotlib's Locator and Formatter here (but may be
# possible in the future).
tick_formatter1 = angle_helper.FormatterDMS()

grid_helper = GridHelperCurveLinear(tr,
                                    extreme_finder=extreme_finder,
                                    grid_locator1=grid_locator1,
                                    tick_formatter1=tick_formatter1
                                    )

Nuevamente, el transData de los ejes sigue siendo una coordenada rectilínea (coordenada de imagen). Puede realizar manualmente la conversión entre dos coordenadas, o puede usar Parasite Axes para mayor comodidad:

ax1 = SubplotHost(fig, 1, 2, 2, grid_helper=grid_helper)

# A parasite axes with given transform
ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal")
# note that ax2.transData == tr + ax1.transData
# Anything you draw in ax2 will match the ticks and grids of ax1.
ax1.parasites.append(ax2)
../../_images/sphx_glr_demo_curvelinear_grid_001.png

Eje flotante #

Un eje flotante es un eje cuya coordenada de datos es fija, es decir, su ubicación no es fija en Coordenadas de ejes, sino que cambia a medida que cambian los límites de datos de los ejes. Se puede crear un eje flotante usando el método new_floating_axis . Sin embargo, es su responsabilidad que el AxisArtist resultante se agregue correctamente a los ejes. Una forma recomendada es agregarlo como un elemento del atributo de eje de Axes.:

# floating axis whose first (index starts from 0) coordinate
# (theta) is fixed at 60

ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 60)
axis.label.set_text(r"$\theta = 60^{\circ}$")
axis.label.set_visible(True)

Vea el primer ejemplo de esta página.

Limitaciones actuales y TODO's #

El código necesita más refinamiento. Aquí hay una lista incompleta de problemas y TODO

  • No es una forma fácil de admitir una ubicación de marca personalizada por el usuario (para cuadrícula curvilínea). Es necesario crear una nueva clase de localizador.

  • FloatingAxis puede tener límites de coordenadas, por ejemplo, un eje flotante de x = 0, pero y solo se extiende de 0 a 1.

  • La ubicación de la etiqueta del eje de FloatingAxis debe proporcionarse opcionalmente como un valor de coordenadas. ej., un eje flotante de x=0 con etiqueta en y=1

Galería generada por Sphinx-Gallery