Pyplot che ordina automaticamente i valori y

Ho un’analisi di frequenza delle parole pronunciate negli episodi del mio programma preferito. Sto facendo un plot.barh (s1e1_y, s1e1_x) ma si sta ordinando per parole invece che per valori. L’output di >>> s1e1_y è

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

e >>>s1e1_x

[42, 30, 26, 25, 24, 22, 20, 19, 19, 18, 18, 18, 17, 17, 15, 15, 14, 14, 13, 13] Quando i grafici sono effettivamente tracciati, il grafico Le zecche dell’asse y sono ordinate alfabeticamente anche se la lista di disegno non è stata ordinata …

 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) 

Da Matplotlib 2.1 in poi è ansible tracciare variabili categoriali. Ciò consente di tracciare plt.bar(["apple","cherry","banana"], [1,2,3]) . Tuttavia in Matplotlib 2.1 l’output verrà ordinato per categoria, quindi in ordine alfabetico. Questo è stato considerato come bug ed è cambiato in matplotlib 2.2 (vedi questo PR ).

In matplotlib 2.2 il grafico a barre preserverebbe quindi l’ordine. In Matplotlib 2.1, si dovrebbero tracciare i dati come dati numerici come in qualsiasi versione precedente alla 2.1. Ciò significa tracciare i numeri rispetto al loro indice e impostare le etichette di conseguenza.

 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() 

inserisci la descrizione dell'immagine qui

Ok, sembra che ci sia un codice spurio nel tuo esempio che non è rilevante per il problema come lo hai descritto, ma partendo dal presupposto che non vuoi che l’asse y sia ordinato alfabeticamente, devi comprimere i tuoi due elenchi in un dataframe quindi traccia il dataframe come segue

 df = pd.DataFrame(list(zip(s1e1_y,s1e1_x))).set_index(1) df.plot.barh() 

Questo quindi produce quanto segue

inserisci la descrizione dell'immagine qui