<div dir="ltr"><div dir="ltr">On Fri, 4 Dec 2020 at 09:14, Bruno Firmani <<a href="mailto:firmanibruno@gmail.com" target="_blank">firmanibruno@gmail.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Molte grazie.</div><div>Chiedo un ulteriore aiuto.</div></div></blockquote><div><br></div><div>Ciao Bruno, </div><div><br></div><div>un po' di risposte quotate in ordine a partire dal tuo messaggio iniziale :) </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div>Ho scritto le seguenti righe di codice:<br><br><br>xx = numpy.array([ 1. , 2. , 3. , 4. , 5. , 6. , 7. , 8. , 9.])<br>yy = numpy.array([ 1./1. , 1./2. , 1./3. , 1./4. , 1./5. , 1./6. , 1./7. , 1./8. , 1./9.])<br>ww = numpy.array([ 1. , 2. , 3. , 5. , 7. , 11. , 13. , 17. , 19.])<br>zz = numpy.array([ 1.**2 , 2.**2 , 3.**2 , 4.**2 , 5.**2 , 6.**2 , 7.**2 , 8.**2 , 9.**2])<br></div></blockquote><div><br></div><div>Ok tutto bene fin qui - un paio di heads up di miglioramento</div><div><br></div><div>1) NumPy ha la funzione `arange` <a href="https://numpy.org/doc/stable/reference/generated/numpy.arange.html">https://numpy.org/doc/stable/reference/generated/numpy.arange.html</a> </div><div>che potresti utilizzare per generare il tuo vettore di coordinate x</div><div>>>> import numpy as np</div><div>>>> x = np.arange(1, 10)</div><div><br></div><div>2) NumPy - a differenza di Python list - supporta il broadcasting degli operatori <a href="https://numpy.org/doc/stable/user/basics.broadcasting.html">https://numpy.org/doc/stable/user/basics.broadcasting.html</a> - tra array e scalare o tra array e array</div><div>Nel tuo caso: </div><div><br></div><div>>>> yy = np.ones(9) / xx  # np.ones genera un array di 1 di lunghezza nove, diviso per xx elemento per elemento</div><div>>>> zz = xx ** 2  # Numpy fa il broadcasting dell'operatore per ciascun elemento di xx. Tutto avviene a C-level, quindi più efficiente che farlo a Py-Level. </div><div><br></div><div>[OT]</div><div>Su 10 numeri non conta nulla. Su 100K, passiamo da micro sec. a nano sec. ;)</div><div>Per divertirti, usando sempre arange (o Python range) prova a generare numeri in range molto più grandi e usa un timeit (<a href="https://docs.python.org/3/library/timeit.html">https://docs.python.org/3/library/timeit.html</a>) </div><div>per prendere i tempi - e ci dirai ;)</div><div> [/OT]</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br>yx = numpy.array( list(zip(xx,yy)) ) <br>wx = numpy.array( list(zip(xx,ww)) ) <br>zx = numpy.array( list(zip(xx,zz)) ) </div></blockquote><div><br></div><div>Se capisco bene, il tuo obiettivo è generare dei plot a partire dai vettori di coordinate utilizzando matplotlib. </div><div>Continuo subito sotto. Quoto qui giusto per dirti che questo passaggio è inutile, e puoi tranquillamente evitarlo - uso di zip compreso.</div><div>Come consiglio generale, sempre meglio evitare passaggi da numpy array -> python list -> numpy array.</div><div>Inoltre, per inciso, matplotlib è flessibile sia che gli si passi Python lists di numeri che numpy array (in generale, sempre meglio NumPy array per efficienza).</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>e dovrei far disegnare, per linee, in un unico grafico le liste di punti:<br>[ [x1,y1] , ... , [xn,yn] ]<br>[ [x1,w1] , ... , [xn,wn] ]<br>[ [x1,z1] , ... , [xn,zn] ]<br>Pensavo di utilizzare matplotlib ma non riesco a trovare le istruzioni giuste.</blockquote><div><br></div><div>La funzione di matplotlib che vorresti usare è plot: <a href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.plot.html">https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.plot.html</a> </div><div>Come vedi dalla documentazione, plot è abbastanza flessibile su come passare le coordinate. Il primo esempio - anche quello più comune - è passare x e y (liste o array) come vettori di coordinate</div><div><br></div><div>Esempio, nel tuo caso</div><div><br></div><div>>>> from matplotlib import pyplot as plt</div><div>>>> plt.plot(xx, yy)</div><div>>>> plt.show()</div><div><br></div><div>Spero che questo esempio chiarisca perché gli array yx, wx, ... non sono necessari :)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div></div><div>Le liste yx, wx, zx  sono adesso liste di punti del piano.<br></div><div>Ora dovrei i loro tre grafici insieme in una unica figura.<br></div></div></blockquote><div><br></div><div>Benissimo, arriviamo all'ultimo punto. </div><div>Matplotlib è basato sul disegno di Canvas - tradotto in altri termini, ogni volta che matplotlib deve disegnare un nuovo punto o un nuovo grafico, ridisegna sulla stessa figura, la nuova figura (di default).</div><div>In altre parole, finché non si invoca esplicitamente il metodo show() - il canvas di riferimento è sempre lo stesso. </div><div><br></div><div>Cosa intendo dire? che puoi continuare ad invocare plt.plot tutte le volte che vuoi e con coordinate diverse **prima** di invocare il plt.show() finale che mostra tutto.</div><div>Traduco in codice (full example) </div><div><br></div><div>>>> from matplotlib import pyplot as plt</div><div>>>> plt.figure(figsize=(10, 10))  # non veramente necessario ma solo per mostrarti come creare un oggetto figure. Questa Figure rappresenta l'oggetto in cui le canvas verranno disegnate</div><div>>>> plt.plot(xx, yy, )</div><div>>>> plt.plot(xx, ww)</div><div>>>> plt.plot(xx, zz)</div><div>>>> plt.show()</div><div><br></div><div>Per un plot più sensato vorrai naturalmente cambiare colori e magari anche marker alle linee - ti invito a dare di nuovo una occhiata alla doc di plot linkata prima. </div><div><br></div><div>Last but not least, se volessi invece avere più plot nella stessa figura ma NON sovrapposti, dovrai sostiture al mio plt.figure, plt.subplots (<a href="https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.subplot.html">https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.subplot.html</a>)</div><div>Esempio di uso in fondo alla pagina. </div><div><br></div><div>Spero sia stato sufficientemente chiaro su tutti i punti. Se non fosse così, fa pure sapere :)</div><div><br></div><div>A presto,</div><div>Valerio</div></div></div>