web-dev-qa-db-fra.com

multiple plot in one figure in Python

Je suis nouveau sur python et j'essaie de tracer plusieurs lignes de la même figure à l'aide de matplotlib. La valeur de mon axe Y est stockée dans un dictionnaire et je crée les valeurs correspondantes dans l'axe X dans le code suivant

Mon code est comme ça:

for i in range(len(ID)):
AxisY= PlotPoints[ID[i]]
if len(AxisY)> 5:
    AxisX= [len(AxisY)]
    for i in range(1,len(AxisY)):
        AxisX.append(AxisX[i-1]-1)
    plt.plot(AxisX,AxisY)
    plt.xlabel('Lead Time (in days)')
    plt.ylabel('Proportation of Events Scheduled')
    ax = plt.gca()
    ax.invert_xaxis()
    ax.yaxis.tick_right()
    ax.yaxis.set_label_position("right")
    plt.show()

Mais je reçois des chiffres séparés avec une seule parcelle, une par une. Quelqu'un peut-il m'aider à comprendre ce qui ne va pas avec mon code? Pourquoi ne puis-je pas produire un tracé multi-lignes? Merci beaucoup!

39
user3183660

C'est très simple à faire:

import matplotlib.pyplot as plt

plt.plot(<X AXIS VALUES HERE>, <Y AXIS VALUES HERE>, 'line type', label='label here')
plt.plot(<X AXIS VALUES HERE>, <Y AXIS VALUES HERE>, 'line type', label='label here')
plt.legend(loc='best')
plt.show()

Vous pouvez continuer à ajouter plt.plot autant de fois que vous le souhaitez. Pour ce qui est de line type, vous devez d’abord spécifier la couleur. Donc pour le bleu, c’est b. Et pour une ligne normale, c'est -. Un exemple serait:

plt.plot(total_lengths, sort_times_heap, 'b-', label="Heap")
74
Games Brainiac

Comme je n'ai pas assez de réputation pour commenter, je vais répondre à la question le 20 février à 10h01 en réponse à la question initiale.

Pour que les étiquettes de ligne soient affichées, vous devez ajouter plt.legend à votre code. pour construire sur l'exemple précédent ci-dessus qui inclut également title, ylabel et xlabel:

import matplotlib.pyplot as plt

plt.plot(<X AXIS VALUES HERE>, <Y AXIS VALUES HERE>, 'line type', label='label here')
plt.plot(<X AXIS VALUES HERE>, <Y AXIS VALUES HERE>, 'line type', label='label here')
plt.title('title')
plt.ylabel('ylabel')
plt.xlabel('xlabel')
plt.legend()
plt.show()
13
Stian

[~ # ~] éditer [~ # ~] : Je viens de me rendre compte qu'après avoir relu votre question, je n'ai pas répondu à votre question. Vous voulez entrer plusieurs lignes dans le même tracé. Cependant, je vais en rester là, car cela m'a très bien servi à plusieurs reprises. J'espère que vous le trouverez utile un jour

J'ai trouvé cela il y a quelque temps lors de l'apprentissage de python

import matplotlib as plt
import matplotlib.gridspec as gridspec

fig = plt.figure() 
# create figure window

gs = gridspec.GridSpec(a, b)
# Creates grid 'gs' of a rows and b columns 


ax = plt.subplot(gs[x, y])
# Adds subplot 'ax' in grid 'gs' at position [x,y]


ax.set_ylabel('Foo') #Add y-axis label 'Foo' to graph 'ax' (xlabel for x-axis)


fig.add_subplot(ax) #add 'ax' to figure

vous pouvez aussi faire différentes tailles en une figure, utilisez des tranches dans ce cas:

 gs = gridspec.GridSpec(3, 3)
 ax1 = plt.subplot(gs[0,:]) # row 0 (top) spans all(3) columns

consultez le docs pour plus d’aide et d’exemples. Ce petit peu, j’ai tapé une fois pour moi, et est également très copié/copié à partir de la documentation. J'espère que cela vous aidera ... Je me souviens qu'il est difficile pour # $% de se familiariser avec la notation de tranche pour les tracés de différentes tailles dans une figure. Après cela, je pense que c'est très simple :)

9
Kraay89

Le PO indique que chaque élément de tracé remplace le précédent plutôt que d'être combiné en un seul tracé. Cela peut se produire même avec l'une des nombreuses suggestions formulées par d'autres réponses. Si vous sélectionnez plusieurs lignes et que vous les exécutez ensemble, dites:

plt.plot(<X>, <Y>)
plt.plot(<X>, <Z>)

les éléments de tracé seront généralement rendus ensemble, une couche superposée. Mais si vous exécutez le code ligne par ligne, chaque tracé remplacera le précédent.

C'est peut-être ce qui est arrivé au PO. Cela m'est juste arrivé: j'avais configuré une nouvelle liaison de clé pour exécuter du code en appuyant simplement sur une touche (sur spyder), mais ma liaison de clé n'exécutait que la ligne actuelle. La solution consistait à sélectionner des lignes par blocs entiers ou à exécuter le fichier entier.

0
PatrickT