matplotlib frequency-analysis

matplotlib - Pyplot ordenando los valores y automáticamente



frequency-analysis (2)

Desde matplotlib 2.1 en adelante 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, por lo tanto, alfabéticamente. Esto se consideró un error y se cambió en matplotlib 2.2 (consulte este PR ).

En matplotlib 2.2, el diagrama de barras 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 etiquetas 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()

Tengo un análisis de frecuencia de palabras dichas en episodios de mi programa 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 parcelas se trazan realmente, la gráfica Las marcas del 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)


Ok, parece que tiene un montón de código espurio en su ejemplo que no es relevante para el problema como lo describió, pero suponiendo que no desea que el eje y se ordene alfabéticamente, entonces necesita comprimir sus dos listas en un trama de datos luego trazar la trama de datos de la siguiente manera

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

Esto produce lo siguiente