Comment créer un histogramme 2d en python avec matplotlib ?

Published: 29 mai 2014

DMCA.com Protection Status

Exemples de comment créer un histogramme 2d en python avec matplotlib

Avec la fonction matplotlib hist2d

Pour créer un histogramme 2d en python et le tracer avec matplotlib il existe plusieurs solutions. Le plus simple est d'utiliser la fonction matplotlib hist2d.

from numpy import c_

import numpy as np
import matplotlib.pyplot as plt
import random

n = 100000

x = np.random.standard_normal(n)
y = 3.0 * x + 2.0 * np.random.standard_normal(n)

Note: si vos données sont dans un fichier (data.txt par exemple):

-1.97965874896 -7.16247661299
-0.326184108313 -3.30336677657
0.804581568977 2.01236810129
0.956767993891 5.73449356815
0.640996608682 4.80528729039
0.516617563432 1.89773430157
-0.263865123489 -0.708296452938
-0.282288527909 -0.938531482069
2.40868958562 10.4996832992
-1.9819139465 -7.84691502438
.
.
.

on peut utiliser la fonction numpy loadtxt():

x, y = np.loadtxt("data.txt",unpack=True)

tracer avec hist2d()

plt.hist2d(x,y)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_01.png", bbox_inches='tight')

plt.close()

Comment créer un histogramme 2d en python avec matplotlib ?
Comment créer un histogramme 2d en python avec matplotlib ?

Récupérer les paramètres de l'histogramme

On peut aussi récupérer les paramètres de l'histogramme comme par exemple le nombre de points dans une boite donnée:

h, xedges, yedges, image = plt.hist2d(x,y)

print(h)
print('----------')

print(xedges)
print('----------')

print(yedges)
print('----------')

plt.close()

Changer la taille des intervalles de classe

Pour changer la taille des boite on peut utiliser l'option bins:

plt.hist2d(x,y,bins=50)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_02.png", bbox_inches='tight')

plt.close()

Comment créer un histogramme 2d en python avec matplotlib ?
Comment créer un histogramme 2d en python avec matplotlib ?

Autre exemple avec des intervalles de classe différentes pour x et y:

x_min = np.min(x)
x_max = np.max(x)

y_min = np.min(y)
y_max = np.max(y)

x_bins = np.linspace(x_min,x_max,50)
y_bins = np.linspace(y_min,y_max,20)

plt.hist2d(x,y,bins=[x_bins,y_bins])

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_03.png", bbox_inches='tight')

plt.close()

Comment créer un histogramme 2d en python avec matplotlib ?
Comment créer un histogramme 2d en python avec matplotlib ?

Changer l'échelle des couleurs

On peut changer l'échelle des couleurs avec l'option cmap (voir Choosing Colormaps in Matplotlib)

plt.hist2d(x,y,bins=50, cmap=plt.cm.jet)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_04.png", bbox_inches='tight')

plt.close()

Comment créer un histogramme 2d en python avec matplotlib ?
Comment créer un histogramme 2d en python avec matplotlib ?

Ajouter une échelle des couleurs

On peut aussi ajouter une échelle des couleurs avec plt.colorbar():

plt.hist2d(x,y,bins=50, cmap=plt.cm.jet)

plt.colorbar()

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_08.png", bbox_inches='tight')

plt.close()

Comment créer un histogramme 2d en python avec matplotlib ?
Comment créer un histogramme 2d en python avec matplotlib ?

Filtrer les données avant de construire l'histogramme

Un exemple en supprimant des données (-999 par exemple):

data = c_[x,y]

for i in range(100):
    x_idx = random.randint(0,n-1)
    data[x_idx,0] = -999

data = data[data[:,0]!=-999]

plt.hist2d(data[:,0],data[:,1],bins=50, cmap=plt.cm.jet)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_05.png", bbox_inches='tight')

plt.close()

Comment créer un histogramme 2d en python avec matplotlib ?
Comment créer un histogramme 2d en python avec matplotlib ?

Avec la fonction matplotlib hexbin

Autre solution avec la fonction matplotlib hexbin:

plt.hexbin(x,y,bins=50, cmap=plt.cm.jet)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_06.png", bbox_inches='tight')

plt.close()

Comment créer un histogramme 2d en python avec matplotlib ?
Comment créer un histogramme 2d en python avec matplotlib ?

Avec la fonction numpy histogram2d

Autre solution avec la fonction numpy histogram2d

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)
#extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]

plt.imshow(heatmap,origin='lower')
#plt.imshow(heatmap,origin='lower', extent=extent)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_07.png", bbox_inches='tight')

plt.close()

Comment créer un histogramme 2d en python avec matplotlib ?
Comment créer un histogramme 2d en python avec matplotlib ?

Exemple de code python

Code python complet crée durant la réalisation de cet article:

from numpy import c_

import numpy as np
import matplotlib.pyplot as plt
import random

n = 100000

x = np.random.standard_normal(n)
y = 3.0 * x + 2.0 * np.random.standard_normal(n)

# read data from a file:

#x, y = np.loadtxt("data.txt",unpack=True)

#for i in range(10):
#   print(x[i],y[i])

#----------------------------------------------------------------------------------------#
# Using matplotlib hist2d function

plt.hist2d(x,y)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_01.png", bbox_inches='tight')

plt.close()

#----------------------------------------------------------------------------------------#
# Get 2d histogram model paramaters

h, xedges, yedges, image = plt.hist2d(x,y)

print(h)
print('----------')

print(xedges)
print('----------')

print(yedges)
print('----------')

plt.close()

#----------------------------------------------------------------------------------------#
# Change bins size

plt.hist2d(x,y,bins=50)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_02.png", bbox_inches='tight')

plt.close()

#----------------------------------------------------------------------------------------#
# Change bins size (custume size)

x_min = np.min(x)
x_max = np.max(x)

y_min = np.min(y)
y_max = np.max(y)

x_bins = np.linspace(x_min,x_max,50)
y_bins = np.linspace(y_min,y_max,20)

plt.hist2d(x,y,bins=[x_bins,y_bins])

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_03.png", bbox_inches='tight')

plt.close()

#----------------------------------------------------------------------------------------#
# Change the color bar

plt.hist2d(x,y,bins=50, cmap=plt.cm.jet)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_04.png", bbox_inches='tight')

plt.close()

#----------------------------------------------------------------------------------------#
# Add color bar

plt.hist2d(x,y,bins=50, cmap=plt.cm.jet)

plt.colorbar()

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_08.png", bbox_inches='tight')

plt.close()

#----------------------------------------------------------------------------------------#
# Filter the data

data = c_[x,y]

for i in range(100):
    x_idx = random.randint(0,n-1)
    data[x_idx,0] = -999

data = data[data[:,0]!=-999]

plt.hist2d(data[:,0],data[:,1],bins=50, cmap=plt.cm.jet)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_05.png", bbox_inches='tight')

plt.close()

#----------------------------------------------------------------------------------------#
# Using matplotlib hexbin function

plt.hexbin(x,y,bins=50, cmap=plt.cm.jet)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_06.png", bbox_inches='tight')

plt.close()

#----------------------------------------------------------------------------------------#
# Using numpy hexbin function

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)
#extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]

plt.imshow(heatmap,origin='lower')
#plt.imshow(heatmap,origin='lower', extent=extent)

plt.title("How to plot a 2d histogram with matplotlib ?")

plt.savefig("histogram_2d_07.png", bbox_inches='tight')

plt.close()

Références

Image

of