Matploit

Tutorial Completo di Matplotlib

Matplotlib è la libreria più popolare per la visualizzazione dei dati in Python. Fornisce un controllo completo su ogni aspetto delle visualizzazioni e può creare una vasta gamma di grafici, dai semplici plot 2D alle complesse visualizzazioni 3D.

Risorse Utili

  1. Documentazione Ufficiale: https://matplotlib.org/stable/contents.html

  2. Galleria Esempi: https://matplotlib.org/stable/gallery/index.html

  3. Cheat Sheet: https://matplotlib.org/cheatsheets/

  4. Matplotlib Tutorials: https://matplotlib.org/stable/tutorials/index.html

Indice

  1. Installazione e Importazione

  2. Concetti Fondamentali

    • Figure e Axes

    • Stile e Personalizzazione

  3. Tipi di Grafici

    • Line Plot

    • Scatter Plot

    • Bar Plot

    • Histogram

    • Pie Chart

    • Box Plot

    • Heatmap

    • 3D Plot

  4. Subplots

  5. Personalizzazione Avanzata

  6. Animazioni

  7. Esempi Pratici

1. Installazione e Importazione

Installazione

pip install matplotlib
# oppure
conda install matplotlib

Importazione

import matplotlib.pyplot as plt
import numpy as np

# Magic command per Jupyter Notebook (visualizzazione inline)
%matplotlib inline

# Per visualizzazione interattiva
%matplotlib widget

2. Concetti Fondamentali

Figure e Axes

# Creazione di una figura e un axes
fig, ax = plt.subplots()

# Metodo più semplice (crea figura e axes automaticamente)
plt.plot([1, 2, 3, 4])
plt.ylabel('Valori')
plt.show()

Stile e Personalizzazione

# Visualizzare stili disponibili
print(plt.style.available)

# Applicare uno stile
plt.style.use('ggplot')  # 'seaborn', 'classic', 'dark_background', etc.

# Torna allo stile predefinito
plt.style.use('default')

3. Tipi di Grafici

Line Plot

# Dati di esempio
x = np.linspace(0, 10, 100)
y = np.sin(x)

# Line plot base
plt.figure(figsize=(10, 6))  # Dimensioni figura
plt.plot(x, y, label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)', linestyle='--', color='red')
plt.title('Funzioni Trigonometriche')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

Scatter Plot

# Dati di esempio
np.random.seed(42)
x = np.random.randn(100)
y = np.random.randn(100)
colors = np.random.rand(100)
sizes = 1000 * np.random.rand(100)

# Scatter plot
plt.figure(figsize=(10, 6))
scatter = plt.scatter(x, y, c=colors, s=sizes, alpha=0.7, cmap='viridis')
plt.colorbar(scatter, label='Intensità')
plt.title('Scatter Plot con Colori e Dimensioni')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True, alpha=0.3)
plt.show()

Bar Plot

# Dati di esempio
categorie = ['A', 'B', 'C', 'D', 'E']
valori = [23, 45, 56, 12, 67]
errori = [2, 3, 5, 1, 4]

# Bar plot verticale
plt.figure(figsize=(10, 6))
bars = plt.bar(categorie, valori, yerr=errori, capsize=5, 
               color=['red', 'blue', 'green', 'orange', 'purple'], alpha=0.7)
plt.title('Bar Plot con Errori')
plt.ylabel('Valori')

# Aggiungere valori sopra le barre
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2., height + 1,
             f'{height}', ha='center', va='bottom')

plt.show()

# Bar plot orizzontale
plt.figure(figsize=(10, 6))
plt.barh(categorie, valori, color='skyblue')
plt.title('Bar Plot Orizzontale')
plt.xlabel('Valori')
plt.show()

Histogram

# Dati di esempio
data = np.random.normal(0, 1, 1000)

# Histogram
plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, density=True, alpha=0.7, color='blue', edgecolor='black')
plt.title('Distribuzione Normale')
plt.xlabel('Valore')
plt.ylabel('Densità')

# Aggiungere una curva di densità
from scipy.stats import norm
x = np.linspace(-4, 4, 100)
plt.plot(x, norm.pdf(x, 0, 1), 'r-', lw=2)

plt.show()

Pie Chart

# Dati di esempio
etichette = ['Python', 'Java', 'C++', 'JavaScript', 'Altri']
dimensione = [45, 20, 15, 10, 10]
colori = ['gold', 'lightcoral', 'lightskyblue', 'lightgreen', 'violet']
esplodi = (0.1, 0, 0, 0, 0)  # Esplode la prima fetta

# Pie chart
plt.figure(figsize=(8, 8))
plt.pie(dimensione, explode=esplodi, labels=etichette, colors=colori,
        autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')  # Assicura che il grafico sia circolare
plt.title('Distribuzione Linguaggi di Programmazione')
plt.show()

Box Plot

# Dati di esempio
np.random.seed(42)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# Box plot
plt.figure(figsize=(10, 6))
box = plt.boxplot(data, patch_artist=True, labels=['Gruppo 1', 'Gruppo 2', 'Gruppo 3'])

# Personalizzare i colori
colors = ['lightblue', 'lightgreen', 'pink']
for patch, color in zip(box['boxes'], colors):
    patch.set_facecolor(color)

plt.title('Box Plot Comparativo')
plt.ylabel('Valori')
plt.grid(True, alpha=0.3)
plt.show()

Heatmap

# Dati di esempio
np.random.seed(42)
data = np.random.rand(10, 12)

# Heatmap
plt.figure(figsize=(12, 8))
heatmap = plt.imshow(data, cmap='viridis')

# Aggiungere barra dei colori
cbar = plt.colorbar(heatmap)
cbar.set_label('Intensità')

# Aggiungere annotazioni
for i in range(data.shape[0]):
    for j in range(data.shape[1]):
        plt.text(j, i, f'{data[i, j]:.2f}', ha='center', va='center', color='white')

plt.title('Heatmap Example')
plt.xlabel('Colonne')
plt.ylabel('Righe')
plt.show()

3D Plot

from mpl_toolkits.mplot3d import Axes3D

# Dati 3D
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# Creare dati
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# Surface plot
surf = ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)

# Aggiungere barra dei colori
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=5)

ax.set_title('Surface Plot 3D')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

4. Subplots

# Creare una griglia di subplots
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('Multiple Subplots')

# Dati
x = np.linspace(0, 10, 100)

# Primo subplot
axes[0, 0].plot(x, np.sin(x), 'r-')
axes[0, 0].set_title('Seno')
axes[0, 0].grid(True)

# Secondo subplot
axes[0, 1].plot(x, np.cos(x), 'b-')
axes[0, 1].set_title('Coseno')
axes[0, 1].grid(True)

# Terzo subplot
axes[1, 0].plot(x, np.tan(x), 'g-')
axes[1, 0].set_title('Tangente')
axes[1, 0].set_ylim(-5, 5)
axes[1, 0].grid(True)

# Quarto subplot
axes[1, 1].plot(x, np.exp(x), 'm-')
axes[1, 1].set_title('Esponenziale')
axes[1, 1].grid(True)

# Aggiustare spaziatura
plt.tight_layout()
plt.show()

5. Personalizzazione Avanzata

# Creare un grafico altamente personalizzato
fig, ax = plt.subplots(figsize=(12, 8))

x = np.linspace(0, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# Linee con personalizzazione avanzata
ax.plot(x, y1, label='sin(x)', linewidth=3, linestyle='-', 
        marker='o', markersize=4, markerfacecolor='red', markeredgecolor='black')

ax.plot(x, y2, label='cos(x)', linewidth=2, linestyle='--', 
        color='green', alpha=0.7)

# Personalizzare assi
ax.set_xlabel('Angolo (radianti)', fontsize=14, fontweight='bold')
ax.set_ylabel('Valore', fontsize=14, fontweight='bold')
ax.set_title('Funzioni Trigonometriche', fontsize=16, fontweight='bold')

# Personalizzare ticks
ax.set_xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
ax.set_xticklabels(['0', 'π/2', 'π', '3π/2', '2π'], fontsize=12)

# Griglia
ax.grid(True, which='both', linestyle='--', alpha=0.5)

# Legenda
ax.legend(loc='upper right', fontsize=12, shadow=True, framealpha=1.0)

# Aggiungere annotazioni
ax.annotate('Massimo del seno', xy=(np.pi/2, 1), xytext=(np.pi/2 + 0.5, 0.8),
            arrowprops=dict(facecolor='black', shrink=0.05, width=1.5),
            fontsize=12)

# Aggiungere testo
ax.text(4, 0, 'Punto di interesse', fontsize=12, 
        bbox=dict(boxstyle="round,pad=0.3", facecolor="yellow", alpha=0.7))

# Impostare limiti degli assi
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1.2, 1.2)

# Aggiungere una linea orizzontale e verticale
ax.axhline(y=0, color='k', linestyle='-', alpha=0.3)
ax.axvline(x=np.pi, color='gray', linestyle=':', alpha=0.5)

plt.tight_layout()
plt.show()

6. Animazioni

from matplotlib.animation import FuncAnimation
from IPython.display import HTML

# Creare un'animazione
fig, ax = plt.subplots(figsize=(8, 6))
x = np.linspace(0, 2*np.pi, 100)
line, = ax.plot(x, np.sin(x))
ax.set_ylim(-1.5, 1.5)
ax.set_title('Animazione Onda Sinusoidale')
ax.grid(True)

def animate(frame):
    line.set_ydata(np.sin(x + frame/10))  # Aggiornare i dati
    return line,

# Creare animazione
ani = FuncAnimation(fig, animate, frames=100, interval=50, blit=True)

# Per salvare l'animazione (richiede ffmpeg)
# ani.save('onda.mp4', writer='ffmpeg', fps=30)

# Per visualizzare in Jupyter
plt.close()  # Previene la visualizzazione del plot statico
HTML(ani.to_jshtml())

7. Esempi Pratici

Analisi di Dati con Matplotlib e Pandas

import pandas as pd

# Creare dati di esempio
np.random.seed(42)
date_rng = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
df = pd.DataFrame(date_rng, columns=['date'])
df['sales'] = np.random.randint(100, 500, size=(len(date_rng)))
df['temperature'] = np.random.normal(20, 5, size=(len(date_rng)))
df['day_of_week'] = df['date'].dt.day_name()
df['month'] = df['date'].dt.month_name()

# Analisi vendite mensili
monthly_sales = df.groupby('month')['sales'].sum().reindex([
    'January', 'February', 'March', 'April', 'May', 'June',
    'July', 'August', 'September', 'October', 'November', 'December'
])

# Grafico vendite mensili
plt.figure(figsize=(12, 6))
bars = plt.bar(monthly_sales.index, monthly_sales.values, color='skyblue')
plt.title('Vendite Mensili 2023')
plt.xlabel('Mese')
plt.ylabel('Vendite')
plt.xticks(rotation=45)

# Aggiungere valori sopra le barre
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2., height + 50,
             f'{int(height)}', ha='center', va='bottom')

plt.tight_layout()
plt.show()

# Correlazione tra temperatura e vendite
plt.figure(figsize=(10, 6))
plt.scatter(df['temperature'], df['sales'], alpha=0.5, c=df['sales'], cmap='viridis')
plt.colorbar(label='Vendite')
plt.title('Correlazione: Temperatura vs Vendite')
plt.xlabel('Temperatura (°C)')
plt.ylabel('Vendite')
plt.grid(True, alpha=0.3)

# Aggiungere linea di tendenza
z = np.polyfit(df['temperature'], df['sales'], 1)
p = np.poly1d(z)
plt.plot(df['temperature'], p(df['temperature']), "r--", alpha=0.8)

plt.show()

Dashboard con Multiple Visualizzazioni

# Creare una dashboard completa
fig = plt.figure(figsize=(16, 12))

# Definire layout della griglia
gs = fig.add_gridspec(3, 3)

# Grafico 1: Andamento temporale
ax1 = fig.add_subplot(gs[0, :])
df.set_index('date')['sales'].plot(ax=ax1, color='blue')
ax1.set_title('Andamento Vendite Giornaliere')
ax1.set_ylabel('Vendite')
ax1.grid(True, alpha=0.3)

# Grafico 2: Distribuzione vendite
ax2 = fig.add_subplot(gs[1, 0])
ax2.hist(df['sales'], bins=30, color='green', alpha=0.7, edgecolor='black')
ax2.set_title('Distribuzione Vendite')
ax2.set_xlabel('Vendite')
ax2.set_ylabel('Frequenza')

# Grafico 3: Boxplot per giorno della settimana
ax3 = fig.add_subplot(gs[1, 1])
day_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
df['day_of_week'] = pd.Categorical(df['day_of_week'], categories=day_order, ordered=True)
df.boxplot(column='sales', by='day_of_week', ax=ax3)
ax3.set_title('Vendite per Giorno della Settimana')
ax3.set_xticklabels(ax3.get_xticklabels(), rotation=45)
ax3.set_ylabel('Vendite')

# Grafico 4: Heatmap correlazione
ax4 = fig.add_subplot(gs[1, 2])
corr_matrix = df[['sales', 'temperature']].corr()
im = ax4.imshow(corr_matrix, cmap='coolwarm', vmin=-1, vmax=1)
ax4.set_xticks([0, 1])
ax4.set_yticks([0, 1])
ax4.set_xticklabels(['Vendite', 'Temperatura'])
ax4.set_yticklabels(['Vendite', 'Temperatura'])
ax4.set_title('Matrice di Correlazione')

# Aggiungere valori alla heatmap
for i in range(len(corr_matrix)):
    for j in range(len(corr_matrix)):
        text = ax4.text(j, i, f'{corr_matrix.iloc[i, j]:.2f}',
                       ha="center", va="center", color="w")

# Grafico 5: Pie chart distribuzione mensile
ax5 = fig.add_subplot(gs[2, :2])
monthly_sales.plot.pie(autopct='%1.1f%%', ax=ax5)
ax5.set_title('Distribuzione Percentuale Vendite Mensili')
ax5.set_ylabel('')  # Rimuovere etichetta y

# Grafico 6: Bar plot temperatura media mensile
ax6 = fig.add_subplot(gs[2, 2])
monthly_temp = df.groupby('month')['temperature'].mean().reindex([
    'January', 'February', 'March', 'April', 'May', 'June',
    'July', 'August', 'September', 'October', 'November', 'December'
])
monthly_temp.plot.bar(ax=ax6, color='orange')
ax6.set_title('Temperatura Media Mensile')
ax6.set_xlabel('Mese')
ax6.set_ylabel('Temperatura (°C)')
ax6.tick_params(axis='x', rotation=45)

plt.tight_layout()
plt.suptitle('Dashboard Analisi Vendite 2023', fontsize=16, fontweight='bold', y=1.02)
plt.show()

Perfetto! Ecco il codice che puoi copiare e incollare nel tuo notebook Matplotlib per aggiungere esempi con dataset reali (Iris e Titanic).


📊 Esempi con Dataset Reali (Iris & Titanic)

1️⃣ Scatter Plot con Dataset Iris

import pandas as pd
import matplotlib.pyplot as plt

# Caricamento dataset Iris
iris_url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv"
iris = pd.read_csv(iris_url)

plt.figure()
plt.scatter(iris['sepal_length'], iris['sepal_width'], c='blue', alpha=0.5)
plt.title("Iris - Sepal Length vs Sepal Width")
plt.xlabel("Sepal Length")
plt.ylabel("Sepal Width")
plt.show()

2️⃣ Analisi Dataset Titanic

# Caricamento dataset Titanic
titanic_url = "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv"
titanic = pd.read_csv(titanic_url)

# Istogramma età passeggeri
plt.figure()
titanic['age'].dropna().hist(bins=30)
plt.title("Distribuzione Età Passeggeri (Titanic)")
plt.xlabel("Età")
plt.ylabel("Frequenza")
plt.show()

# Bar chart: sopravvissuti vs non sopravvissuti
plt.figure()
titanic['survived'].value_counts().plot(kind='bar')
plt.title("Sopravvissuti vs Non Sopravvissuti")
plt.xlabel("Sopravvissuto (0=No, 1=Sì)")
plt.ylabel("Numero Passeggeri")
plt.show()

Last updated