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

Active 29 mai 2014    /    Viewed 5722    /    Comments 0    /    Edit


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 ?

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 ?

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 ?

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 ?

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 ?

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 ?

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 ?

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 ?

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


Card image cap
profile-image
Daidalos

Hi, I am Ben.

I have developed this web site from scratch with Django to share with everyone my notes. If you have any ideas or suggestions to improve the site, let me know ! (you can contact me using the form in the welcome page). Thanks!