web-dev-qa-db-fra.com

Pyplot triant les valeurs y automatiquement

J'ai une analyse de fréquence des mots dits dans les épisodes de mon émission préférée. Je fais un plot.barh (s1e1_y, s1e1_x) mais c'est un tri par mots au lieu de valeurs . La sortie de >>> s1e1_yis

['know', 'go', 'now', 'here', 'gonna', 'can', 'them', 'think', 'come', 'time', 'got', 'elliot', 'talk', 'out', 'night', 'been', 'then', 'need', 'world', "what's"]

et >>>s1e1_x

[42, 30, 26, 25, 24, 22, 20, 19, 19, 18, 18, 18, 17, 17, 15, 15, 14, 14, 13, 13] Lorsque les tracés sont réellement tracés, les graduations de l'axe des ordonnées du graphique sont triées par ordre alphabétique, même si la liste des tracés n'est pas triée ...

s1e1_wordlist = []
s1e1_count = []
for Word, count in s1e01:
    if((Word[:-1] in excluded_words) == False):
        s1e1_wordlist.append(Word[:-1])
        s1e1_count.append(int(count))
s1e1_sorted = sorted(list(sorted(Zip(s1e1_count, s1e1_wordlist))), 
reverse=True)
s1e1_20 = []
for i in range(0,20):
    s1e1_20.append(s1e1_sorted[i])
s1e1_x = []
s1e1_y = []
for count, Word in s1e1_20:
    s1e1_x.append(Word)
    s1e1_y.append(count)
plot.figure(1, figsize=(20,20))
plot.subplot(341)
plot.title('Season1 : Episode 1')
plot.tick_params(axis='y',labelsize=8)
plot.barh(s1e1_x, s1e1_y)
6
robert strickland

À partir de matplotlib 2.1, vous pouvez tracer des variables catégorielles. Cela permet de tracer plt.bar(["Apple","cherry","banana"], [1,2,3]). Cependant, dans matplotlib 2.1, le résultat sera trié par catégorie, donc par ordre alphabétique. Ceci était considéré comme un bug et est modifié dans matplotlib 2.2 (voir ce PR ). 

Dans matplotlib 2.2, le graphique en barres conserverait donc l'ordre. Dans matplotlib 2.1, vous devez tracer les données sous forme de données numériques, comme dans toute version antérieure à 2.1. Cela signifie tracer les nombres par rapport à leur index et définir les étiquettes en conséquence. 

w = ['know', 'go', 'now', 'here', 'gonna', 'can', 'them', 'think', 'come', 
 'time', 'got', 'elliot', 'talk', 'out', 'night', 'been', 'then', 'need', 
 'world', "what's"]
n = [42, 30, 26, 25, 24, 22, 20, 19, 19, 18, 18, 18, 17, 17, 15, 15, 14, 14, 13, 13]

import matplotlib.pyplot as plt
import numpy as np

plt.barh(range(len(w)),n)
plt.yticks(range(len(w)),w)

plt.show()

 enter image description here

Ok, votre exemple semble contenir beaucoup de codes parasites qui ne sont pas pertinents pour le problème tel que vous l'avez décrit, mais en supposant que vous ne vouliez pas que l'axe des ordonnées trie par ordre alphabétique, vous devez compresser vos deux listes dataframe puis tracez le dataframe comme suit

df = pd.DataFrame(list(Zip(s1e1_y,s1e1_x))).set_index(1)

df.plot.barh()

Ceci produit alors le suivant

 enter image description here

1
Paula Livingstone