2010-09-21 12 views
14

Ho un grafico che ha la data/ora sull'asse xe alcuni dati del segnale sull'asse y. Come documentazione voglio inserire immagini temporizzate in relazione a punti specifici della trama. È possibile tracciare una linea in una trama per un'immagine in una sequenza di immagini sotto la trama?Combina immagine e plottaggio con Python Matplotlib

risposta

16

This demo dalla galleria matplotlib mostra come inserire immagini, disegnare linee a loro, ecc. Posterò l'immagine dalla galleria, e puoi seguire il codice link per vedere il codice. enter image description here

Ed ecco il codice (dalla versione 2.1.2):

import matplotlib.pyplot as plt 
import numpy as np 

from matplotlib.patches import Circle 
from matplotlib.offsetbox import (TextArea, DrawingArea, OffsetImage, 
            AnnotationBbox) 
from matplotlib.cbook import get_sample_data 


if 1: 
    fig, ax = plt.subplots() 

    # Define a 1st position to annotate (display it with a marker) 
    xy = (0.5, 0.7) 
    ax.plot(xy[0], xy[1], ".r") 

    # Annotate the 1st position with a text box ('Test 1') 
    offsetbox = TextArea("Test 1", minimumdescent=False) 

    ab = AnnotationBbox(offsetbox, xy, 
         xybox=(-20, 40), 
         xycoords='data', 
         boxcoords="offset points", 
         arrowprops=dict(arrowstyle="->")) 
    ax.add_artist(ab) 

    # Annotate the 1st position with another text box ('Test') 
    offsetbox = TextArea("Test", minimumdescent=False) 

    ab = AnnotationBbox(offsetbox, xy, 
         xybox=(1.02, xy[1]), 
         xycoords='data', 
         boxcoords=("axes fraction", "data"), 
         box_alignment=(0., 0.5), 
         arrowprops=dict(arrowstyle="->")) 
    ax.add_artist(ab) 

    # Define a 2nd position to annotate (don't display with a marker this time) 
    xy = [0.3, 0.55] 

    # Annotate the 2nd position with a circle patch 
    da = DrawingArea(20, 20, 0, 0) 
    p = Circle((10, 10), 10) 
    da.add_artist(p) 

    ab = AnnotationBbox(da, xy, 
         xybox=(1.02, xy[1]), 
         xycoords='data', 
         boxcoords=("axes fraction", "data"), 
         box_alignment=(0., 0.5), 
         arrowprops=dict(arrowstyle="->")) 

    ax.add_artist(ab) 

    # Annotate the 2nd position with an image (a generated array of pixels) 
    arr = np.arange(100).reshape((10, 10)) 
    im = OffsetImage(arr, zoom=2) 
    im.image.axes = ax 

    ab = AnnotationBbox(im, xy, 
         xybox=(-50., 50.), 
         xycoords='data', 
         boxcoords="offset points", 
         pad=0.3, 
         arrowprops=dict(arrowstyle="->")) 

    ax.add_artist(ab) 

    # Annotate the 2nd position with another image (a Grace Hopper portrait) 
    fn = get_sample_data("grace_hopper.png", asfileobj=False) 
    arr_img = plt.imread(fn, format='png') 

    imagebox = OffsetImage(arr_img, zoom=0.2) 
    imagebox.image.axes = ax 

    ab = AnnotationBbox(imagebox, xy, 
         xybox=(120., -80.), 
         xycoords='data', 
         boxcoords="offset points", 
         pad=0.5, 
         arrowprops=dict(
          arrowstyle="->", 
          connectionstyle="angle,angleA=0,angleB=90,rad=3") 
         ) 

    ax.add_artist(ab) 

    # Fix the display limits to see everything 
    ax.set_xlim(0, 1) 
    ax.set_ylim(0, 1) 

    plt.show() 
+0

fa qualcuno sa se funziona in 3D? possiamo aggiungere un'immagine ad un aereo? – CromeX

+0

@CromeX: si prega di fare una domanda a parte. I collegamenti – tom10

+0

non sembrano funzionare più. –

14

Se ho capito bene la domanda, allora forse questo può aiutare:

import scipy 
import pylab 
fig = pylab.figure() 
axplot = fig.add_axes([0.07,0.25,0.90,0.70]) 
axplot.plot(scipy.randn(100)) 
numicons = 8 
for k in range(numicons): 
    axicon = fig.add_axes([0.07+0.11*k,0.05,0.1,0.1]) 
    axicon.imshow(scipy.rand(4,4),interpolation='nearest') 
    axicon.set_xticks([]) 
    axicon.set_yticks([]) 
fig.show() 
fig.savefig('iconsbelow.png') 

alt text

+0

Quando i bordi neri attorno alle immagini non sono desiderabili, i comandi 'axicon.set_xticks ([])' e 'axicon.set_yticks ([])' può essere sostituito da 'axicon.axis ('off')'. –

Problemi correlati