web-dev-qa-db-fra.com

tracer un histogramme sur une échelle de log avec Matplotlib

J'ai un DataFrame pandas qui a les valeurs suivantes dans une série

x = [2, 1, 76, 140, 286, 267, 60, 271, 5, 13, 9, 76, 77, 6, 2, 27, 22, 1, 12, 7, 19, 81, 11, 173, 13, 7, 16, 19, 23, 197, 167, 1]

On m'a demandé de tracer deux histogrammes dans un cahier Jupyter avec Python 3.6. Pas de sueur, non?

x.plot.hist(bins=8)
plt.show()

J'ai choisi 8 bacs parce que cela me semblait préférable ... J'ai également été chargé de tracer un autre histogramme avec le journal de x.

x.plot.hist(bins=8)
plt.xscale('log')
plt.show()

Cet histogramme a l'air terrible. Est-ce que je ne fais pas quelque chose de bien? J'ai essayé de jouer avec l'intrigue, mais tout ce que j'ai essayé semble simplement rendre l'histogramme encore pire. Exemple:

x.plot(kind='hist', logx=True)

Je n'ai pas reçu d'instructions autres que de tracer le journal de X sous forme d'histogramme. 

J'apprécie vraiment toute aide !!! 

Pour mémoire, j'ai importé pandas, numpy et matplotlib et spécifié que le tracé devrait être en ligne. 

4
Tommy

Spécifier bins=8 dans l'appel hist signifie que la plage entre les valeurs minimale et maximale est divisée également en 8 groupes. Ce qui est égal sur une échelle linéaire est déformé sur une échelle logarithmique. 

Ce que vous pouvez faire est de spécifier les cases de l'histogramme de manière à ce qu'elles aient une largeur inégale qui leur donne un aspect égal sur une échelle logarithmique. 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

x = [2, 1, 76, 140, 286, 267, 60, 271, 5, 13, 9, 76, 77, 6, 2, 27, 22, 1, 12, 7, 
     19, 81, 11, 173, 13, 7, 16, 19, 23, 197, 167, 1]
x = pd.Series(x)

# histogram on linear scale
plt.subplot(211)
hist, bins, _ = plt.hist(x, bins=8)

# histogram on log scale. 
# Use non-equal bin sizes, such that they look equal on log scale.
logbins = np.logspace(np.log10(bins[0]),np.log10(bins[-1]),len(bins))
plt.subplot(212)
plt.hist(x, bins=logbins)
plt.xscale('log')
plt.show()

 enter image description here

13

tracer un autre histogramme avec le journal de x.

n'est pas la même chose que tracer x sur l'échelle logarithmique. Tracer le logarithme de x serait

np.log(x).plot.hist(bins=8)
plt.show()

 hist

La différence est que les valeurs de x elles-mêmes ont été transformées: nous examinons leur logarithme. 

Cela diffère du tracé de l'échelle logarithmique, où nous gardons x identiques mais modifions la manière dont l'axe horizontal est marqué (ce qui serre les barres à droite et les étend à gauche).

4
user6655984