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