una tuplas sirve que por para listas lista imprimir elementos ejemplo definir comprensión colecciones python matplotlib

python - tuplas - ¿Qué significa un argumento de tupla de 4 elementos para ''bbox_to_anchor'' en matplotlib?



para que sirve una lista en python (2)

En la sección "Ubicación de leyenda" de la "Guía de leyenda" en el sitio web de matplotlib, hay un pequeño script donde la línea 9 es plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, ncol=2, mode="expand", borderaxespad=0.) . Todas las tuplas que he visto pasar a bbox_to_anchor tienen 2 elementos, pero este tiene 4. ¿Qué significa cada elemento si la tupla que se pasa tiene 4 elementos?

Lo estaba viendo en los docs pyplot.legend , y decía algo acerca de bbox_transform coordenadas bbox_transform . Así que miré a mi alrededor y encontré matplotlib.transforms.Bbox con una static from_bounds(x0, y0, width, height) .

Estaba adivinando que la configuración para el parámetro 4-tuple se basaba en esto from_bounds . Copié el script a Spyder, hice %matplotlib en una consola Ipython y cambié algunos valores. Parecía tener sentido, pero cuando intenté solo cambiar .102 a algo como 0.9 , la leyenda no cambió. Creo que la tupla se basa en from_bounds , simplemente no sé por qué cambiar el último valor en la tupla no hizo nada.


La respuesta de @ ImportanceOfBeingErnest es excelente. Me gustaría ampliar sobre el significado de alignment entre el cuadro de leyenda y el cuadro delimitador. Significa que la posición diferente indicada por el parámetro loc para el cuadro de leyenda y el cuadro de límite se colocará en el mismo punto.

Por ejemplo, si loc=''center'' , el cuadro del centro de la leyenda y el cuadro delimitador estarán en el mismo punto. Si loc=''center right'' , el centro a la derecha del cuadro de leyenda y el cuadro delimitador estarán en el mismo punto. Perdón por la verbosidad ...

Tomemos un ejemplo concreto para ilustrar esta idea,

Cuatro coordenadas para bbox_to_anchor

import matplotlib.pyplot as plt import numpy as np import matplotlib.patches as patches locs = [''upper right'', ''lower left'', ''center left'', ''lower center'', ''center'', ''right''] x0, y0, width, height = 0.5, 0.5, 0.1, 0.4 x = np.arange(0.1, 4, 0.1) y = 1.0/x fig = plt.figure(figsize=(10, 10)) idx = 1 for i in range(0, 2): for j in range(0, 3): ax = fig.add_subplot(3, 2, idx) ax.plot(x, y, label=r''$/frac{1}{x}$'') ax.legend(loc=locs[idx-1], bbox_to_anchor=(x0, y0, width, height), edgecolor=''g'', fontsize=''large'', framealpha=0.5, borderaxespad=0) ax.add_patch( patches.Rectangle((x0, y0), width, height, color=''r'', fill=False, transform=ax.transAxes) ) ax.text(0.6, 0.2, s="loc = ''{}''".format(locs[idx-1]), transform=ax.transAxes) idx += 1 plt.show()

El código anterior produce la imagen de abajo,

En la imagen, el cuadro rojo es el cuadro delimitador y el cuadro verde es el cuadro de leyenda. loc en cada subparcela indica la relación de alineación entre los dos cuadros.

Dos coordenadas para bbox_to_anchor

Cuando solo hay dos valores dados a bbox_to_anchor , el ancho y la altura del cuadro delimitador se establecen en cero. Vamos a modificar un poco el código anterior,

import matplotlib.pyplot as plt import numpy as np import matplotlib.patches as patches locs = [''upper right'', ''lower left'', ''center left'', ''lower center'', ''center'', ''right''] x0, y0, width, height = 0.5, 0.5, 0, 0 x = np.arange(0.1, 4, 0.1) y = 1.0/x fig = plt.figure(figsize=(10, 10)) idx = 1 for i in range(0, 2): for j in range(0, 3): ax = fig.add_subplot(3, 2, idx) ax.plot(x, y, label=r''$/frac{1}{x}$'') ax.legend(loc=locs[idx-1], bbox_to_anchor=(x0, y0, width, height), edgecolor=''g'', fontsize=''large'', framealpha=0.5, borderaxespad=0) ax.add_patch( patches.Rectangle((x0, y0), width, height, color=''r'', fill=False, transform=ax.transAxes) ) ax.text(0.6, 0.2, s="loc = ''{}''".format(locs[idx-1]), transform=ax.transAxes) ax.plot(x0, y0, ''r.'', markersize=8, transform=ax.transAxes) idx += 1 plt.show()

Ahora, la imagen producida se convierte en

El punto rojo en la imagen anterior indica la posición de la coordenada del cuadro enlazado.


Tienes razón, la 4-tupla en plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3) se establece como (x0, y0, width, height) donde (x0,y0) son las coordenadas de la esquina inferior izquierda del cuadro delimitador.

Mientras esos parámetros establecen el cuadro delimitador para la leyenda, el tamaño vertical real de la leyenda se reduce al tamaño que se necesita para colocar los elementos. Además, su posición se determina solo en conjunto con el parámetro loc . El parámetro loc establece la alineación de la leyenda dentro del cuadro delimitador, de modo que, en algunos casos, no se observará ninguna diferencia al cambiar la height , compare, por ejemplo, la gráfica (2) y (4).