2
votes

Comment couper de longues étiquettes dans Matplotlib

Je voudrais couper de longues étiquettes, de sorte que seules les 4 premières lettres soient affichées, sans changer les valeurs dans le bloc de données d'origine.

Exemple:

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

np.random.seed(89)

# Toy Dataset
d = pd.DataFrame(np.random.randint(0,3, size=(100, 1)), columns=['var'])
d['var'] = (np.where(d['var'] == 1,'Long loooooong loooooong text',d['var']))

# Plot
f, axes = plt.subplots()
sns.countplot(y='var', data=d, orient='h');

Sortie actuelle : entrez la description de l'image ici

Résultat souhaitable:

 entrez la description de l'image ici


0 commentaires

3 Réponses :


0
votes

essayez ceci:

first_four_letters = your_string[:4]

pour obtenir les 4 premières lettres d'une chaîne:

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

np.random.seed(89)

# Toy Dataset
d = pd.DataFrame(np.random.randint(0,3, size=(100, 1)), columns=['var'])
d['var'] = (np.where(d['var'] == 1,'Long loooooong loooooong text'[:4],d['var']))

# Plot
f, axes = plt.subplots()
sns.countplot(y='var', data=d, orient='h');


1 commentaires

Bien que cela réponde à la question, je ne vois toujours pas la raison pour laquelle d'abord mettre une grande chaîne, puis prendre les quatre premiers caractères. Cette longue chaîne n'a aucun autre but dans le code et est redondante. Alors pourquoi l'utiliser par codage en dur



2
votes

Je vais fournir une solution un peu générale: parcourez vos étiquettes y-tick, puis créez une liste de nouvelles étiquettes, qui ne stocke que jusqu'à 4 caractères si une étiquette a plus de 4 caractères. Enfin, attribuez cette nouvelle liste d'étiquettes en tant que coches y

new_labels = [i.get_text()[0:4] if len(i.get_text()) > 4 else i.get_text() 
              for i in ax.yaxis.get_ticklabels()]

Ou vous pouvez créer les nouvelles étiquettes sur une seule ligne en utilisant la compréhension de liste comme

# Plot
f, axes = plt.subplots()
ax = sns.countplot(y='var', data=d, orient='h');

new_labels = []

for i in ax.yaxis.get_ticklabels():
    label = i.get_text()
    if len(label) > 4:
        new_labels.append(label[0:4])
    else:    
        new_labels.append(label)

ax.yaxis.set_ticklabels(new_labels)  


1 commentaires

C'est exactement ce que je cherchais. Merci!



2
votes

Pour résoudre ce problème, il est préférable de fournir déjà les données sous forme abrégée.

df2 = d.copy()
df2["var"] = df2["var"].apply(lambda x: x[:4])

# Plot
f, axes = plt.subplots()
sns.countplot(y='var', data=df2, orient='h');

entrez la description de l'image ici


0 commentaires