こんにちは、アキホです。
機械/電気 修士卒で、現在自動車開発に携わっています。
理系ならではの観点から、理論立てて紹介していきたいと思います。
今回は
【凡例重複対策】Python(Matplotlib)を使用したcsvグラフ作成
です。
こんな悩み事を抱えている人向けの記事です。
Pythonでcsvを描画するとき、凡例が重複する
こんな現象が起きた経験はないですか?
この凡例重複に対して
実際の事例とコードを公開し、凡例重複対策を具体的に紹介します。
ちなみに私は
解析システムの出力結果がcsvなので、よく自動検証プログラムを作っているのですが
ここで詰まったため、備忘録として残しておきます。
では、解説をしていきます。
なぜ凡例重複が起きるの?
この現象が起きている方はこんな事していませんか?
→ A列の数字毎にfor文でB列をプロットしている。
Time | A | B |
1 | 1 | 0.1 |
2 | 2 | 0.1 |
3 | 1 | 0.2 |
4 | 1 | 0.3 |
5 | 1 | 0.4 |
6 | 3 | 0.1 |
7 | 4 | 0.1 |
8 | 1 | 0.5 |
9 | 1 | 0.6 |
ソースコードはこんな感じですかね?
#変数定義df_tmp = {}labels = [‘1′,’2′,’3′,’4′,’5’]MAX = 6 #Aの最大数を入力#csv読み込みdf = pd.read_csv(‘sample.csv’, delimiter=’;’)#描画領域for i in range(1,MAX,1):df_tmp = df[ df[‘A’] == i ]plt.plot(df_tmp[‘Time’], df_tmp[‘B’], label=labels[i])
Time | A | B | |
1 | 1 | 0.1 | →plot |
2 | 2 | 0.1 | |
3 | 1 | 0.2 | →plot |
4 | 1 | 0.3 | |
5 | 1 | 0.4 | |
6 | 3 | 0.1 | |
7 | 4 | 0.1 | |
8 | 1 | 0.5 | →plot |
9 | 1 | 0.6 |
凡例重複対策はコレ!プロットするときに条件分岐!
イメージ的にはこんな感じです。
Time | A | B | |
1 | 1 | 0.1 | →plot |
2 | 2 | 0.1 | |
3 | 1 | 0.2 | →plot(凡例は無し) |
4 | 1 | 0.3 | |
5 | 1 | 0.4 | |
6 | 3 | 0.1 | |
7 | 4 | 0.1 | |
8 | 1 | 0.5 | →plot(凡例は無し) |
9 | 1 | 0.6 |
このようなイメージを実装すれば、凡例重複が起きなくなるはず。。。
では、上記のイメージをソースコードに記述していきましょう。
#変数定義df_tmp = {}labels = [‘1′,’2′,’3′,’4′,’5’]MAX = 6 #Aの最大数を入力#csv読み込みdf = pd.read_csv(‘sample.csv’, delimiter=’;’)#描画領域for i in range(1,MAX,1):df_tmp = df[ df[‘A’] == i ]if i == 1:plt.plot(df_tmp[‘Time’], df_tmp[‘B’], label=labels[i])else:plt.plot(df_tmp[‘Time’], df_tmp[‘B’])
では、出力を確認してみましょう。
上手くいきました。
Matplotlibに凡例重複対策はないの?
余談になりますが、Matplotlibに凡例重複対策はありません。
csvからグラフを描画されている方々はほとんどMatplotlibを通りますよね。。
そして、凡例の出力は
plt.legend()
を使用しているかと思います。
わざわざ条件分岐でかっこ悪いコード書くなんてしたくないと
私も思いました。。
しかし、Matplotlibのドキュメントを確認しても記載されていません。
こんな例は特殊だから、そもそも需要がないのか。。
はたまた、ほとんどの人がcsv自体を編集するソースコードを書いているのか。。。
真相は分かりません。
ただ、個人的にはこの方法が一番楽かなぁと思ってます。
それでは。
コメント