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_y
is
['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)
À 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()
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