Ajustez la largeur du bac de manière nette et précise avec l'histogramme de matplotlib et seaborn

introduction

unsplash-logoIcons8 Team

Afin de confirmer la distribution des données pour chaque étiquette, les histogrammes sont souvent superposés et tracés, mais il existe des cas où la différence de largeur de bac est perceptible en fonction des données. Cela ne se produit pas même si vous utilisez des outils BI tels que Tableau, mais matplotlib et seaborn ne l'ajustent pas seuls, vous devez donc le gérer vous-même.

Méthode

Utilisez l'argument bins.

bins : int or sequence or str, optional matplotlib.pyplot.hist

Puisque bins peut recevoir non seulement des valeurs entières mais aussi des séquences, Il vous suffit de spécifier les valeurs maximum et minimum dans la fonction de plage et de définir le nombre de divisions souhaité.


import numpy as np
import matplotlib.pyplot as plt

#Préparer un DataFrame avec deux types d'étiquettes et une distribution de données différente
df_1st = pd.DataFrame(np.random.normal(loc=20, scale=10, size=100), columns=["val"])
df_1st["target"] = "class_1"
df_2nd = pd.DataFrame(np.random.normal(loc=15, scale=20, size=100), columns=["val"])
df_2nd["target"] = "class_2"

df = pd.concat([df_1st, df_2nd])

Avant la correction de la largeur du bac

import matplotlib as plt
import seaborn as sns

#Tracer pour chaque cible
for val in df["target"].unique():
    ax = sns.distplot(df.query('target == @val')["val"], kde=False, label=f"target is {val}")

ax.legend()

Après correction de la largeur du bac

#valeur minimum
x_min = int(df["val"].min())

#Valeur maximum
x_max = int(df["val"].max())

#5 intervalles dans la plage allant de la valeur minimale à la valeur maximale
range_bin_width = range(x_min, x_max, 5)

#Tracer pour chaque cible
for val in df["target"].unique():
    ax = sns.distplot(df.query('target == @val')["val"], bins=range_bin_width, kde=False, label=f"target is {val}")

ax.legend()

Supplément

Si bins n'est pas défini, le nombre de bins est déterminé par une méthode appelée ** règle de Freedman-Diaconis **. Cette technique est raisonnablement bonne, et lors du traçage d'une seule donnée, elle trace généralement sans problème.

distributions.py


def _freedman_diaconis_bins(a):
    """Calculate number of hist bins using Freedman-Diaconis rule."""
    # From https://stats.stackexchange.com/questions/798/
    a = np.asarray(a)
    if len(a) < 2:
        return 1
    h = 2 * iqr(a) / (len(a) ** (1 / 3))
    # fall back to sqrt(a) bins if iqr is 0
    if h == 0:
        return int(np.sqrt(a.size))
    else:
        return int(np.ceil((a.max() - a.min()) / h))

https://github.com/mwaskom/seaborn/blob/master/seaborn/distributions.py#L24

en conclusion

L'intrigue n'est pas belle parce que l'intrigue est impolie envers la personne à qui vous la montrez Je pense qu'il est poli de le rendre au moins propre.

Recommended Posts

Ajustez la largeur du bac de manière nette et précise avec l'histogramme de matplotlib et seaborn
Ajustez le rapport de plusieurs chiffres avec le gridspec de Matplotlib
Ajustez l'espacement entre les chiffres avec Matplotlib
Alignez la taille de la barre de couleurs avec matplotlib
Réglez l'axe vertical de l'histogramme sur la fréquence relative (hauteur totale des colonnes = 1) et la densité de fréquence relative (surface totale de l'histogramme = 1) avec matplotlib
Augmentez la taille de la police du graphique avec matplotlib
Remplissez la largeur du bloc-notes Jupyter pour remplir le navigateur
La base de la théorie des graphes avec l'animation matplotlib
Visualisez le comportement de l'algorithme de tri avec matplotlib
histogramme avec matplotlib
Ajoutez des informations au bas de la figure avec Matplotlib
Visualisez la gamme d'insertions internes et externes avec python
Vue d'ensemble et astuces de Seaborn avec visualisation de données statistiques
Ajustez les axes avec matplotlib
[Dessin graphique] J'ai essayé d'écrire un graphique à barres multi-séries avec matplotlib et seaborn
Animez les valeurs alpha et bêta des principales valeurs boursières mondiales avec pandas + matplotlib
Effectuer une analyse isocurrent des canaux en eau libre avec Python et matplotlib
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
Découvrez la puissance de l'accélération avec NumPy / SciPy
Reformatez l'axe des temps du graphique de la série chronologique des pandas avec matplotlib
Visualisons le nombre de personnes infectées par le virus corona avec matplotlib
J'ai écrit le fonctionnement de base de matplotlib dans Jupyter Lab
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Comment unifier la largeur du bac lors de l'affichage de plusieurs histogrammes les uns sur les autres (matplotlib)
Précautions lors de la superposition de la fonction de densité de probabilité et de l'histogramme dans matplotlib
Affichage japonais de matplotlib, seaborn
comportement de matplotlib: histgramme normé
Changer le style de matplotlib
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
[Objet obligatoire DI] Implémenter et comprendre le mécanisme de DI avec Go
Pour améliorer la réutilisabilité et la maintenabilité des flux de travail créés avec Luigi