[Python] Comment créer un histogramme bidimensionnel avec Matplotlib

Lors du dessin d'un histogramme à deux variables, le "graphe tridimensionnel" ou la "fréquence bidimensionnelle est attribué à la couleur ou à la densité". Bien qu'il soit facile de comprendre le changement de direction de fréquence dans le graphe tridimensionnel, il peut être difficile de comprendre la distribution globale car il y a des parties cachées. En revanche, lorsque la fréquence est attribuée à la couleur ou à la densité en deux dimensions, il est difficile de comprendre la différence subtile dans la direction de la fréquence, mais il est facile de saisir quelle est la distribution globale.

Les données

Deux distributions normales bidimensionnelles sont utilisées comme données. La répartition est la suivante.

import numpy as np
x, y = np.vstack((np.random.multivariate_normal([0, 0], [[10.0, 0],[0,20]], 5000) 
                 ,np.random.multivariate_normal([0,15], [[10.0, 0],[0, 5]], 5000))).T

hist2d_01.png

2D histogram L'histogramme bidimensionnel utilise hist2d de matplotlib. La fréquence de l'histogramme est obtenue comme valeur de retour. Les valeurs de retour sont «count, xedges, yedges, Image».

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

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=40, cmap=cm.jet)
ax.set_title('1st graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_02.png

Spécifier le nombre de bacs

Le nombre de bacs est déterminé par les bacs de paramètres. S'il est spécifié par scalaire, le nombre de casiers sera le même verticalement et horizontalement. Si vous souhaitez les spécifier séparément, utilisez l'exemple. Le bord peut être spécifié de la même manière que l'histogramme unidimensionnel.

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

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[40,10], cmap=cm.jet)
ax.set_title('2nd graph')
ax.set_xlabel('x')
ax.set_ylabel('y')

fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_03.png

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

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], cmap=cm.jet)
ax.set_title('3rd graph')
ax.set_xlabel('x')
ax.set_ylabel('y')

fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_04.png

Normalisation

Si vous souhaitez normaliser l'histogramme, définissez le paramètre normé sur True.

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

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], normed=True, cmap=cm.jet)
ax.set_title('4th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')

fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_05.png

Changer la carte des couleurs

Pour changer la palette de couleurs, spécifiez-la dans le paramètre cmap comme indiqué dans l'exemple.

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

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], normed=True, cmap=cm.gray)
ax.set_title('5th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_06.png

Spécifiez la plage de la palette de couleurs

Vous souhaiterez peut-être spécifier une plage de palette de couleurs lors de la comparaison de plusieurs histogrammes. Dans ce cas, utilisez set_clim comme dans l'exemple.

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

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], normed=True, cmap=cm.jet)
ax.set_title('6th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
H[3].set_clim(0,0.05)
fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_07.png

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

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], normed=True, cmap=cm.jet)
ax.set_title('7th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
H[3].set_clim(0,0.01)
fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_08.png

Échelle logarithmique

Si vous voulez que l'histogramme soit mis à l'échelle du journal, utilisez matplotlib.colors.LogNorm ().

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], norm=matplotlib.colors.LogNorm(), cmap=cm.jet)
ax.set_title('8th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')

fig.colorbar(H[3],ax=ax)
plt.show()

hist2d_09.png

Superposer le contour au-dessus de l'histogramme

Les lignes de contour sont écrites en utilisant le contour. À ce stade, faites attention aux points suivants

  1. Spécifiez les valeurs maximale et minimale avec extension afin que les positions horizontale et verticale correspondent à l'histogramme.
  2. Le compte se transpose car il contient des données sur l'axe des x dans la direction verticale et des données sur l'axe des y dans la direction horizontale.
  3. Utilisez LogNorm pour l'affichage logarithmique. Vous n'êtes pas obligé de l'avoir, mais vous pouvez difficilement voir la ligne sans cela.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
import matplotlib.cm as cm

fig = plt.figure()
ax = fig.add_subplot(111)

counts, xedges, yedges, Image= ax.hist2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)], norm=matplotlib.colors.LogNorm(), cmap=cm.jet)
ax.contour(counts.transpose(),extent=[xedges.min(),xedges.max(),yedges.min(),yedges.max()])
ax.set_title('8th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.colorbar(Image,ax=ax)
plt.show()

hist2d_10.png

Rendre la forme de bac de l'histogramme hexagonal

Lorsque vous souhaitez rendre la forme de la bouteille hexagonale.

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

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hexbin(x,y, gridsize=20, extent=[-30, 30, -30, 30], cmap=cm.jet)
ax.set_title('8th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.colorbar(H,ax=ax)
plt.show()

hist2d_11.png

Lisser l'histogramme (estimation de la densité du noyau)

L'histogramme est Blocky, en particulier lorsque les bacs sont largement espacés. Il existe une méthode appelée estimation de la densité du noyau pour relier cela en douceur. Ceci sert à estimer la fonction de densité de probabilité à partir de la distribution de l'échantillon de variables aléatoires.

l'estimation de la densité du noyau est incluse dans scipy et scikit-learn. L'estimation de la densité du noyau de scipy spécifie la largeur de bande normalisée par l'écart type. En conséquence, même si la distribution des données change, elle peut être estimée en douceur. Par conséquent, lorsque le paramètre bw_method = 1.0, value.std (ddof = 1) est utilisé comme bande passante. (la valeur est donnée) Ici, ddof est divisé par N-ddof lors du calcul de l'écart type aux degrés de liberté delta.

Avec kernel = gaussian_kde (value), le noyau est un objet gaussian_kde, donc si vous voulez vraiment obtenir la valeur, Passez les positions des coordonnées x et y comme kernel (positions).

En fait, un maillage est créé avec mgrid, x et y sont rendus unidimensionnels séparément avec ravel, et ils sont attachés avec vstack puis passés au noyau.

Puisque la valeur retournée par kernel (positions) est unidimensionnelle, elle est rendue bidimensionnelle par remodelage.

Enfin, il est affiché sous forme de graphique avec contourf.

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
import matplotlib.cm as cm

xx,yy = np.mgrid[-30:30:1,-30:30:1]
positions = np.vstack([xx.ravel(),yy.ravel()])
 
value = np.vstack([x,y])

kernel = gaussian_kde(value)

f = np.reshape(kernel(positions).T, xx.shape)

fig = plt.figure()
ax = fig.add_subplot(111)

ax.contourf(xx,yy,f, cmap=cm.jet)
ax.set_title('11th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

hist2d_12.png

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
import matplotlib.cm as cm

xx,yy = np.mgrid[-30:30:1,-30:30:1]
positions = np.vstack([xx.ravel(),yy.ravel()])
 
value = np.vstack([x,y])

kernel = gaussian_kde(value, bw_method=0.5)

f = np.reshape(kernel(positions).T, xx.shape)

fig = plt.figure()
ax = fig.add_subplot(111)

ax.contourf(xx,yy,f, cmap=cm.jet)
ax.set_title('12th graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

hist2d_13.png

Lors de l'utilisation de histogram2d de numpy

Vous pouvez créer un histogramme en utilisant histogram2d de numpy. Dans ce cas, la fréquence et les arêtes de x et y peuvent être obtenues, vous devez donc la représenter graphiquement. Ici, imshow a été utilisé pour l'affichage. À ce stade, les données d'histogramme contiennent les données dans la direction de l'axe x dans la direction verticale et les données dans la direction de l'axe y dans la direction horizontale, similaire à hist2d dans matplotlib. Il est déplacé et le point de départ est défini en bas à gauche.

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

fig = plt.figure()
ax = fig.add_subplot(111)

H = np.histogram2d(x,y, bins=[np.linspace(-30,30,61),np.linspace(-30,30,61)])
im = ax.imshow(H[0].T, interpolation='nearest', origin='lower', extent=[-30,30,-30,30], cmap=cm.jet)
ax.set_title('13st graph')
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.colorbar(im, ax=ax)
plt.show()

hist2d_14.png

Recommended Posts

[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
[Python] Comment dessiner un histogramme avec Matplotlib
[Python] Comment dessiner un graphique linéaire avec Matplotlib
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
Comment lire un fichier CSV avec Python 2/3
Comment créer un fichier JSON en Python
[Python] Comment dessiner plusieurs graphiques avec Matplotlib
Étapes pour créer un bot Twitter avec Python
Procédure de création d'application multi-plateforme avec kivy
Créer un diagramme de dispersion 3D avec SciPy + matplotlib (Python)
Créer un gif 3D avec python3
Créer un répertoire avec python
3. Traitement du langage naturel avec Python 1-2. Comment créer un corpus: Aozora Bunko
Comment convertir / restaurer une chaîne avec [] en python
Comment créer un sous-menu avec le plug-in [Blender]
Je souhaite créer manuellement une légende avec matplotlib
[Python] Road to the Serpent (5) Jouez avec Matplotlib
Créer un fichier CAO 2D ".dxf" avec python [ezdxf]
[Python] Comment créer un environnement de serveur Web local avec SimpleHTTPServer et CGIHTTPServer
Python: comment utiliser async avec
Résoudre ABC166 A ~ D avec Python
Comment créer un package Conda
Créez un environnement virtuel avec Python!
Comment créer un pont virtuel
Comment démarrer avec Python
Comment créer un Dockerfile (basique)
Comment calculer la date avec python
Écrire un histogramme empilé avec matplotlib
Comment créer un fichier de configuration
Comment installer NPI + envoyer un message à la ligne avec python
Comment convertir un tableau en dictionnaire avec Python [Application]
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
Probablement le moyen le plus simple de créer un pdf avec Python 3
Comment transloquer un tableau à deux dimensions en utilisant uniquement python [Note]
[Python Kivy] Comment créer une simple fenêtre pop-up
Comment créer un environnement de développement de la série Python2.7 avec Vagrant
Créer un message correspondant à la localisation avec la chaîne de traduction python
[Python Kivy] Comment créer un fichier exe avec pyinstaller
Comment démarrer par lots un programme Python créé avec le notebook Jupyter
Créer un décorateur de fonction Python avec Class
Comment créer un dossier git clone
Comment ajouter un package avec PyCharm
[Python] Comment rendre une classe itérable
Comment dessiner un graphique avec Matplotlib
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Créez une image factice avec Python + PIL.
[Python 3.8 ~] Comment définir intelligemment des fonctions récursives avec des expressions lambda
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
Essayez de créer un environnement python avec Visual Studio Code et WSL
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Comment utiliser BigQuery en Python
[Python] Comment inverser une chaîne de caractères