Invece di parole o numeri sono le etichette di graduazione dell'asse x, voglio disegnare un disegno semplice (fatto di linee e cerchi) come l'etichetta per ogni segno di spunta. È possibile? Se è così, qual è il modo migliore per farlo in matplotlib?Come posso rendere le etichette xtick di un grafico disegni semplici usando matplotlib?
risposta
Rimuovere le etichette di spunta e sostituire il testo con patches. Ecco un breve esempio di eseguire questa operazione:
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))
Ciò risulta nella figura seguente:
È per impostare clip_on
a False
, altrimenti patches
fuori degli assi non sarà mostrato. Le coordinate e le dimensioni (raggio, larghezza, altezza, ecc.) Dei patch dipenderanno da dove si trovano gli assi nella figura. Ad esempio, se stai pensando di farlo con sottotrame, dovrai essere sensibile al posizionamento delle patch in modo da non sovrapporsi a nessun altro asse. Potrebbe valere la pena di investigare su Transformations e definire le posizioni e le dimensioni in un'altra unità (Assi, Figura o display).
Se si dispone di file di immagine specifici che si desidera utilizzare per i simboli, è possibile utilizzare la classe BboxImage
per creare artisti da aggiungere agli assi anziché alle patch. Per esempio ho fatto una semplice icona con il seguente script:
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')
produrre questa immagine:
Poi ho creato una BboxImage nella posizione che voglio l'etichetta segno di spunta e della dimensione I vogliono:
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,
)
notato come ho usato il transData
trasformazione convertire da unità di dati per visualizzare unità, whic h sono richiesti nella definizione di Bbox
.
Ora ho letto l'immagine utilizzando il imread
di routine, e impostarlo di risultati (una matrice NumPy) per i dati di bbox_image
e aggiungere l'artista agli assi:
bbox_image.set_data(imread('thumb.png'))
ax.add_artist(bbox_image)
Questo si traduce in un dato aggiornato :
Se utilizzati direttamente le immagini, assicurarsi di importare le classi ei metodi richiesti:
from matplotlib.image import BboxImage,imread
from matplotlib.transforms import Bbox