Une figure, un Axes, une ligne
Un graphique est le moyen le plus rapide de voir qu'une série de prix est propre, tendancielle ou cassée. Dans matplotlib, une Figure est tout le canevas et un Axes est un graphique sur celui-ci, avec ses lignes, ses étiquettes et sa légende. La méthode orientée objet est fig, ax = plt.subplots() suivi d'appels sur ax : ax.plot(x, y) trace une ligne, ax.set_title, ax.set_xlabel et ax.set_ylabel nomment le graphique. Dessiner sur un Axes explicite, et le renvoyer, rend une fonction de tracé facile à réutiliser et à tester.
import matplotlib
matplotlib.use("Agg") # draw without a window (no screen needed)
import matplotlib.pyplot as plt
import pandas as pd
prices = pd.Series([100.0, 102, 101, 105, 107, 106, 110], index=pd.bdate_range("2026-03-02", periods=7))
fig, ax = plt.subplots()
ax.plot(prices.index, prices.values, label="AAPL")
ax.set_title("Closing price")
ax.set_xlabel("Date")
ax.set_ylabel("Price (USD)")
print(ax.get_title(), "|", ax.get_xlabel(), "|", ax.get_ylabel()) # Closing price | Date | Price (USD)
print(len(ax.lines), ax.lines[0].get_ydata().tolist()) # 1 [100.0, 102.0, 101.0, 105.0, 107.0, 106.0, 110.0]Étiquettes et légende
Avec plusieurs lignes sur un graphique, chacune a besoin d'un nom. Passez label="..." à ax.plot et appelez ax.legend() une fois à la fin : la légende liste les étiquettes dans l'ordre où les lignes ont été tracées. Un graphique sans étiquettes, sans titre et sans unités est une image, pas un résultat. Les lignes ont aussi un style : linestyle="--" donne un trait en pointillés, pratique pour une moyenne qui ne doit pas masquer les prix, et color, linewidth et marker le précisent davantage.
ma = prices.rolling(3).mean()
ax.plot(ma.index, ma.values, label="MA3", linestyle="--")
ax.legend()
print([line.get_label() for line in ax.lines]) # ['AAPL', 'MA3']
print([text.get_text() for text in ax.get_legend().get_texts()]) # ['AAPL', 'MA3']
print(ax.lines[1].get_linestyle(), ax.lines[1].get_ydata().tolist()[:3]) # -- [nan, nan, 101.0] NaN points are simply not drawnLignes de référence, et graphiques invisibles
Une ligne horizontale marque un niveau comme un strike, un stop ou la moyenne : ax.axhline(105, linestyle="--") la trace sur tout le graphique (axvline fait de même à la verticale). Matplotlib peut aussi dessiner sans aucune fenêtre : avec le backend Agg, fig.savefig("chart.png") écrit le graphique dans un fichier, ce qui est la façon dont rapports et serveurs produisent des graphiques. Comme tout ce que vous dessinez reste sur l'objet Axes, un programme (ou un test) peut le relire : les lignes avec ax.lines, leurs données avec get_ydata(), les étiquettes avec get_label(), le titre avec get_title().
ax.axhline(105, linestyle=":", label="level")
level_line = ax.lines[-1]
print(list(level_line.get_ydata()), level_line.get_linestyle(), level_line.get_label()) # [105, 105] : level
fig.savefig("prices.png") # writes the chart to a file; no window, no plt.show() needed
plt.close(fig) # release the figure when you are done with itdef plot_prices(prices):
fig, ax = plt.subplots()
ax.plot(prices.index, prices.values)
ax.set_title("Closing price")
return ax # the caller can add lines, save the chart or inspect it
ax = plot_prices(prices)
print(len(ax.lines), ax.get_title()) # 1 Closing price
plt.close("all")plt.subplots() garde sa figure en mémoire jusqu'à plt.close(fig). Dans une boucle qui dessine des centaines de graphiques, ou dans un serveur, l'oublier fait fuir la mémoire et finit par déclencher un avertissement. Créez la Figure dans la fonction, renvoyez ce dont l'appelant a besoin et laissez l'appelant la fermer.fig, ax = plt.subplots()puisax.plot(x, y); nommez le graphique avecset_title,set_xlabeletset_ylabel.- Donnez un
label=à chaque ligne et appelezax.legend();linestyle="--"trace des pointillés ;ax.axhline(y)une ligne horizontale. - Dessinez sur un Axes et renvoyez-le :
ax.lines,get_ydata()etget_label()relisent le graphique ; utilisezsavefigetplt.closeplutôt queshowdans les programmes.
À suivre : les graphiques en chandeliers, pour dessiner l'ouverture, le plus haut, le plus bas et la clôture de chaque jour.
Lab : ce qui est noté
- Tracer la courbe des prix avec
plot_prices25 pts - Comparer deux séries sur un graphique avec
plot_comparison25 pts - Ajouter une moyenne mobile en pointillés avec
plot_with_average25 pts - Marquer un niveau de prix avec
plot_with_level25 pts