2012-01-04 10 views

Respuesta

23

Quitaría las etiquetas y reemplazaría el texto con patches. He aquí un breve ejemplo de la realización de esta tarea:

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 


# define where to put symbols vertically 
TICKYPOS = -.6 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(range(10)) 

# set ticks where your images will be 
ax.get_xaxis().set_ticks([2,4,6,8]) 
# remove tick labels 
ax.get_xaxis().set_ticklabels([]) 


# add a series of patches to serve as tick labels 
ax.add_patch(patches.Circle((2,TICKYPOS),radius=.2, 
          fill=True,clip_on=False)) 
ax.add_patch(patches.Circle((4,TICKYPOS),radius=.2, 
          fill=False,clip_on=False)) 
ax.add_patch(patches.Rectangle((6-.1,TICKYPOS-.05),.2,.2, 
           fill=True,clip_on=False)) 
ax.add_patch(patches.Rectangle((8-.1,TICKYPOS-.05),.2,.2, 
           fill=False,clip_on=False)) 

Esto se traduce en la siguiente figura:

enter image description here

Es clave para establecer clip_on a False, de lo contrario patches fuera de los ejes no será mostrado. Las coordenadas y tamaños (radio, ancho, alto, etc.) de los parches dependerán de dónde se encuentren sus ejes en la figura. Por ejemplo, si está considerando hacer esto con subtramas, necesitará ser sensible a la colocación de parches para no solaparse con ningún otro eje. Puede valer la pena investigar su Transformations y definir las posiciones y tamaños en otra unidad (Ejes, Figura o pantalla).

Si tiene archivos de imágenes específicos que desea utilizar para los símbolos, puede usar la clase BboxImage para crear artistas que se agregarán a los ejes en lugar de parches. Por ejemplo hice un simple icono con la siguiente secuencia de comandos:

import matplotlib.pyplot as plt 

fig = plt.figure(figsize=(1,1),dpi=400) 
ax = fig.add_axes([0,0,1,1],frameon=False) 
ax.set_axis_off() 

ax.plot(range(10),linewidth=32) 
ax.plot(range(9,-1,-1),linewidth=32) 

fig.savefig('thumb.png') 

producir esta imagen:

enter image description here

Entonces creó un BboxImage en el lugar que quiero la etiqueta de la garrapata y del tamaño de E quieren:

lowerCorner = ax.transData.transform((.8,TICKYPOS-.2)) 
upperCorner = ax.transData.transform((1.2,TICKYPOS+.2)) 

bbox_image = BboxImage(Bbox([lowerCorner[0], 
          lowerCorner[1], 
          upperCorner[0], 
          upperCorner[1], 
          ]), 
         norm = None, 
         origin=None, 
         clip_on=False, 
         ) 

notado cómo he utilizado la transformación transData convertir de unidades de datos para mostrar las unidades, whic h se requieren en la definición de Bbox.

Ahora leo en la imagen usando la rutina imread, y configurarlo de resultados (un array numpy) a los datos de bbox_image y añadir el artista a los ejes:

bbox_image.set_data(imread('thumb.png')) 
ax.add_artist(bbox_image) 

Esto se traduce en una cifra actualizada : enter image description here

Si utiliza directamente las imágenes, asegúrese de importar las clases y los métodos necesarios:

from matplotlib.image import BboxImage,imread 
from matplotlib.transforms import Bbox 
Cuestiones relacionadas