Pyplot ordena los valores y automáticamente

Tengo un análisis de frecuencia de palabras dichas en episodios de mi progtwig favorito. Estoy haciendo un plot.barh (s1e1_y, s1e1_x) pero está ordenando por palabras en lugar de valores. La salida de >>> s1e1_y es

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

y >>>s1e1_x

[42, 30, 26, 25, 24, 22, 20, 19, 19, 18, 18, 18, 17, 17, 15, 15, 14, 14, 13, 13] Cuando las ttwigs se trazan, el gráfico Los ticks de eje y se ordenan alfabéticamente aunque la lista de trazado no esté ordenada …

 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) 

Desde matplotlib 2.1 en puede trazar variables categóricas. Esto permite trazar plt.bar(["apple","cherry","banana"], [1,2,3]) . Sin embargo, en matplotlib 2.1, la salida se ordenará por categoría y, por lo tanto, alfabéticamente. Esto se consideró como error y se cambia en matplotlib 2.2 (ver este PR ).

En matplotlib 2.2, la gráfica de barra preservaría el orden. En matplotlib 2.1, trazaría los datos como datos numéricos como en cualquier versión anterior a 2.1. Esto significa trazar los números contra su índice y establecer las tags en consecuencia.

 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, parece que tienes un montón de código falso en tu ejemplo que no es relevante para el problema tal como lo has descrito, pero suponiendo que no quieres que el eje y se ordene alfabéticamente, entonces necesitas unir tus dos listas en una dataframe luego trazar el dataframe de la siguiente manera

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

Esto luego produce lo siguiente

enter image description here