Skip to content

Introduction to Data Visualization with Matplotlib

Run the hidden code cell below to import the data used in this course.


1 hidden cell

Take Notes

Add notes about the concepts you've learned and code cells with code you want to keep.

Matplotlib

import matplotlib.pyplot as plt fig, ax = plt.subplots()

figure objectif : container (graphe dans lequel vont apparaître les données) ax : partie qui contient les données

ax.plot(df['col1'], df['col2']) (les 2 colonnes correspondent à x et y) plt.show()

on peut ajouter un autre ax.plot pour ajouter une autre courbe

fig, ax = plt.subplots() ax.plot(df1['col1'], ['col2']) ax.plot (df2...) plt.show()

marker="o" (marqueurs ronds pour afficher les points sur la courbe) "v" pour faire des petit triangles etc. linestyle='--' pour faire des tirets on peut faire linestyle ="None" (la ligne disparaît) color = 'r' pour rendre la ligne rouge

ax.set_xlabel("Nom") pour le nom des abscisses ax.set_ylabel(...) ax.set_title("titre")

Small mulitples (créer des sous-parcelles de graphe) fig, ax = plt.subplots(3,2) --> 3 lignes et 2 colonnes (donc 6 petits graphes) Ax devient un array de 3x2

Pour désigner la parcelle où afficher une courbe, ax[0,0].plot(etc) --> 1er graphe en haut à gauche des small multiples

Si 1 seule ligne ou 1 seule colonne, on indique 1 seule coordonnée ax[0]

Si une seule colonne, 1 seul titre abscisse Pour que tous les graphes aient la même échelle de valeurs en ordonnée, sharey = True dans subplots

Time series

pd.read_csv('nom_fichier', parse_date=['col'], index_col="col") pour identifier la col comme portant des valeurs de dates, puis la définir comme index du df

ensuite ax.plot(df.index, etc) poour que l'index date devienne les abscisses

Gérer plusieurs échelles de temps

ax2 = ax.twinx() on rajoute ensuite le 2ème plot qui doit figurer à cette échelle : ax2.plot(etc.) puis ax2.set_ylabel()

(on peut ajouter des couleurs dans set_ylabel )

Aussi : ax.tick_params('y', colors='blue') pour changer la couleur des graduations en ordonnée

On peut définir un fonction qui appliquera toutes ces consignes : def plot_timeseries(axes, x, y, color, xlabel, ylabel) : axes.plot (x, y, color=color) axes.set_xlabel(xlabel) axes.set_ylabel(ylabel, color=color) axes.tick_params('y', colors=color)

ensuite pour créer les plots, on fait plot_timeseries(compléter les arguments de la fonction) puis ax2 = ax.twinx() si différentes échelles Y puis plot_timeseries(ax2, etc.)

Annotating time-series data

ax2.annotate('commentaire', xy=(pd.Timestamp("2015-10-06"), 1)) dans cet exemple pour les coordonnées xy, l'horodatage correspond à X, 1 correspond à Y

Positionner le texte pour qu'il soit lisible: xytext = (coordonnées voulues) ajouter une flèche qui relie le texte et le point: arrowprops={} on peut customiser la flèche : arrowprops={"arrowstyle":"->", "color"="gray"}

Bar-charts index_col=0 dans pd.read pour mettre la 1ere colonne en index fig, ax = plt.subplots() ax.bar(df.index, df['col']) plt.show()

ax.set_xticklabels(df.index, rotation=90) pour une rotation des labels en abscisse

Pour ajouter une deuxième donnée par dessus (empiler) ax.bar(df.index, df['col2'], bottom=df['col1'])

pour une troisième : bottom=df['col1']+df['col2']

légende barres empilées : argument label dans la parenthèse label='string' + ax.legend() avant le show

Histograms fig, ax = plt.subplots() ax.hist(df['col1']) ax.hist(df['col2'])

argument label + plt.legend() argument bins=int ou séquences de valeurs entre crochets

histtype='step' pour que les barres ne soient pas "pleines" (contours seulement)

Statistical plotting

error bars

méthode 1 : ajoute des marqueurs à des barres exemple : ax.bar('nom variable', df['col1].mean(), yerr=df['col1'].std()

méthode 1': ajoute des marqueurs verticaux à des graphes x,y en courbe ax.errorbar(df['col1'], df['col2'], yerr=df['col3'])

méthode 2: adding boxplots ax.boxplots([df1['col1'], df2['col2']]) ax.set_xticklabels(["label1", "label2"])

affiche médiane, interquartile range, ipq, outliers etc.

Scatterplots

ax.scatter(df['col1'], df['col2'])

2 scatter plots sur le même axe --> argument couleur, argument label (on peut le faire sur des subsets de colonnes) argument c=df.index --> dégardé de couleur le long de l'axe des abscisses

Preparing figures to share

change plot style : plt.style.use('ggplot') avant le subplot : couleurs différents, typos, backgrounf gris etc.

plt.style.use("default") autre style : "bmh", "seaborn-colorblind" etc. voir library

Share vizualiations

fig.savefig("nom.png", quality=50, dpi=300) ou nom.jpg ou nom.svg qualité : compression dpi : densité de l'image

ls --> donne la liste des fichiers stockés dans le directory

fig.set_size_inches([valeur1, valeur2]) largeur et hauteur de la figure, on définit la taille

Automating figures from data

var = df['col'].unique() print(var) renvoie en liste toutes les valeurs uniques de la colonne

fig, ax = subplots for variable in var, var_df= df[df["col"]== variable] ax.bar(variable, df['col1'].mean(), yerr=df['col2'].std()) set label + plt.show() va créer une barre pour chacune des valeurs de la colonne initiale

# Add your code snippets here

Explore Datasets

Use the DataFrames imported in the first cell to explore the data and practice your skills!

  • Using austin_weather and seattle_weather, create a Figure with an array of two Axes objects that share a y-axis range (MONTHS in this case). Plot Seattle's and Austin's MLY-TAVG-NORMAL (for average temperature) in the top Axes and plot their MLY-PRCP-NORMAL (for average precipitation) in the bottom axes. The cities should have different colors and the line style should be different between precipitation and temperature. Make sure to label your viz!
  • Using climate_change, create a twin Axes object with the shared x-axis as time. There should be two lines of different colors not sharing a y-axis: co2 and relative_temp. Only include dates from the 2000s and annotate the first date at which co2 exceeded 400.
  • Create a scatter plot from medals comparing the number of Gold medals vs the number of Silver medals with each point labeled with the country name.
  • Explore if the distribution of Age varies in different sports by creating histograms from summer_2016.
  • Try out the different Matplotlib styles available and save your visualizations as a PNG file.