【凡例重複対策】Python(Matplotlib)を使用したcsvグラフ作成

凡例重複対策 勉強

こんにちは、アキホです。

 

機械/電気 修士卒で、現在自動車開発に携わっています。

理系ならではの観点から、理論立てて紹介していきたいと思います。

 

今回は

【凡例重複対策】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])  
このようなソースコードを記述すると、上から順に1に関してプロットしていくため凡例が重複するします。
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自体を編集するソースコードを書いているのか。。。

 

真相は分かりません。

ただ、個人的にはこの方法が一番楽かなぁと思ってます。

 

それでは。

 

コメント

タイトルとURLをコピーしました