web-dev-qa-db-ja.com

y値を自動的にソートするPyplot

私のお気に入りの番組のエピソードで語られる言葉の頻度分析があります。 plot.barh(s1e1_y、s1e1_x)を作成していますが、値ではなく単語でソートしています。 >>> s1e1_yの出力は

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

および>>>s1e1_x

[42, 30, 26, 25, 24, 22, 20, 19, 19, 18, 18, 18, 17, 17, 15, 15, 14, 14, 13, 13]プロットが実際にプロットされると、プロットリストがソートされていなくても、グラフのy軸の目盛りがアルファベット順にソートされます...

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

Matplotlib 2.1以降では、カテゴリ変数をプロットできます。これにより、plt.bar(["Apple","cherry","banana"], [1,2,3])をプロットできます。ただし、matplotlib 2.1では、出力はカテゴリ別にソートされるため、アルファベット順になります。これはバグと見なされ、matplotlib 2.2で変更されました( this PR を参照)。

したがって、matplotlib 2.2では、棒グラフは次数を維持します。 matplotlib 2.1では、2.1より前のバージョンと同様に、データを数値データとしてプロットします。これは、インデックスに対して数値をプロットし、それに応じてラベルを設定することを意味します。

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

さて、あなたはそれを説明したように問題に関係のない多くの偽のコードを例に持っているようですが、y軸をアルファベット順にソートしたくないと仮定すると、2つのリストをZに圧縮する必要がありますデータフレームは、次のようにデータフレームをプロットします

df = pd.DataFrame(list(Zip(s1e1_y,s1e1_x))).set_index(1)

df.plot.barh()

これにより、以下が生成されます

enter image description here

1