Exemples de comment créer un histogramme 2d en python avec matplotlib
Table des matières
- Avec la fonction matplotlib hist2d
- Récupérer les paramètres de l'histogramme
- Changer la taille des intervalles de classe
- Changer l'échelle des couleurs
- Ajouter une échelle des couleurs
- Filtrer les données avant de construire l'histogramme
- Avec la fonction matplotlib hexbin
- Avec la fonction numpy histogram2d
- Exemple de code python
- Références
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()
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()
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()
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()
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()
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()
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()
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()
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
Liens | Site |
---|---|
hist2d | matplotlib.org |
lot a 2D histogram | matplotlib.org |
basic 2D Histograms with matplotlib | python-graph-gallery.com |
hexbin | matplotlib.org |
Python: Creating a 2D histogram from a numpy matrix | stackoverflow |
Generate a heatmap in MatPlotLib using a scatter data set | stackoverflow |
numpy.histogram2d | numpy |
Python: Creating a 2D histogram from a numpy matrix | stackoverflow |
pylab_examples example code: hist2d_log_demo.py | matplotlib doc |
Too many values to unpack” in numpy histogram2d | stackoverflow |
Python random’s randrange() to Get a random number in a range | pynative.com |