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.
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
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()
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()
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()
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()
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()
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()
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()
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()
Les lignes de contour sont écrites en utilisant le contour. À ce stade, faites attention aux points suivants
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()
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()
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()
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()
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()
Recommended Posts