【Python】matplotlibでプロット点とは違う状態(色、サイズ、透明度の変更)で凡例マーカーを表示する方法

matplotlib

基本的に凡例のマーカーはプロットした点と同じ色、状態で表示されます。
例えば赤色でプロットしたら凡例のマーカー表示も赤色になりますし、透明度を高くすれば透明度が高い凡例マーカー表示になります。

しかし透明度が高い凡例マーカーであったり、サイズが小さい凡例マーカーってめっちゃ見ずらいですよね?
また訳あって違う色で表示したい時とかがあるかもしれません。

もしも凡例マーカー表示の状態を変更して表示できるならこの問題は解決しますよね…?
ということで今回はプロットした点とは違う状態で凡例マーカー表示をする方法を紹介します!

この記事の目標
・プロットした点とは違う状態で凡例マーカー表示する方法の理解

[スポンサーリンク]


プロット点と違う状態で凡例表示する方法

凡例をいじるときは基本的にplt.legend()で引数指定を行います。
しかし指定できるのは凡例の記号や色、場所などの設定くらいで
今回行うようなプロットした状態とは違うようにする設定は行えないんです。

そこで別の方法で実現するわけですが、
プロットした点とは違う状態で凡例表示させるには2つの方法があります。
1つ目は空のプロットでダミープロットして辻褄を合わせる方法、2つ目は凡例ハンドラいじって状態を変更する方法です。

2つ目の方法は一部のプロット関数では使用できませんが、1つ目はどの関数でも使用できます。
ということでまずは1つ目の方法を紹介してその後に2つ目の方法を紹介します。
正直どっちでもできるのでお好きな方を使ってみてください。

ダミープロットで凡例表示を変更する

この方法では最初に空のリストでダミープロットして、その後に普通にプロットしてプロットした点と凡例表示を異なる形にします。

文字で言われてもいまいちピンと来ないかもしれないので1つ例を見てみましょう!
x、ya、ybというリストがあり、xとya(凡例名A)、xとyb(凡例名B)で透明度高くプロットしたいとします。
このままだと凡例も透明度が高くなって見ずらいので凡例表示は透明度無しで表示したいです。

そのためにも最初に空リストで凡例ラベルを指定したプロットをします。
その次に全く同じ色でラベル指定せずに透明度高くプロットします。
これによって空リストの凡例が表示されるので透明度無しの凡例が表示されるのです!!

import matplotlib.pyplot as plt

#プロットデータ
x=[1,2,3,4]
ya=[10,20,30,40]
yb=[50,60,70,80]

#グラフ作成
fig = plt.figure(figsize = (8,5))

#ダミープロット(凡例で表示たい状態)
plt.scatter([], [], label = "A", color = "b") #凡例Aのダミープロット
plt.scatter([], [], label = "B", color = "r") #凡例Bのダミープロット

#dataプロット(プロットで表示したい状態)
plt.scatter(x, ya, color = "b", alpha = 0.3) #凡例Aと表示したいプロット
plt.scatter(x, yb, color = "r", alpha = 0.3) #凡例Bと表示したいプロット
plt.legend()
plt.show()

色を合わせてしまえば辻褄が合うので問題なく凡例表示されますよね?

つまり空のリストプロット部分では凡例表示したい状態を指定し、
dataリストプロット部分ではプロットしたい状態を指定すればいいんです。

この時に空リストとdataリストで色を合わせる事を忘れないようにしましょう!
(わざと色を違うようにしたいなら話は別ですが)

色の種類

ちなみに指定できる色は以下の通りです。
色の横に文字が書いてありますが、その文字を指定すれば色指定OKです!../../_images/named_colors.png

matolotliカラーコード例 : https://matplotlib.org/examples/color/named_colors.html

 

凡例ハンドラで凡例表示を変更する

次に凡例ハンドラをいじって凡例表示を変更する方法です。
凡例ハンドラとは凡例の設定がある部分みたいなもんです。
設定をいじれば凡例をプロットした状態とは違うようにできそうですよね。

plt.legend().legendHandlesを用いれば凡例のハンドラをいじくりまわすことができるんです。

凡例ハンドラは凡例1つ1つにあるので凡例が複数あって全部変更したい場合はforで凡例ハンドラをループさせて処理します。
流れ的には以下のような感じになります。

leg = plt.legend()
for leha in leg.legendHandles:
    #凡例ハンドラへの修正

大まかな流れは分かったと思うので、次に修正動作を行うコマンドなどを紹介します。

 

任意の色で凡例マーカー表示

凡例マーカー表示においてプロットした色とは異なる任意の色で表示してみます。
任意の色を設定する時はset_colorを使用しましょう。
指定できる色については後述の色の種類の項目を参照。

でははじめに普通にプロットした場合です。

通常パターン

import matplotlib.pyplot as plt

xa =[1,2,3]
xb = [5,6,7]

ya = [1,2,3]
yb = [5,6,7]

fig = plt.figure(figsize = (8,5))
ax = fig.add_subplot(1,1,1)
ax.scatter(xa,ya,label = "A", s = 20)
ax.scatter(xb,yb,label = "B", s = 20)
ax.legend()
plt.show()

もちろん凡例マーカーの色とプロットした色は同じになります。

ではプロットする色はオレンジ、青だけど凡例マーカーの色は赤、緑にしてみましょう。

 

実行パターン

import matplotlib.pyplot as plt

xa =[1,2,3]
xb = [5,6,7]

ya = [1,2,3]
yb = [5,6,7]

fig = plt.figure(figsize = (8,5))
ax = fig.add_subplot(1,1,1)
ax.scatter(xa,ya,label = "A", s = 20)
ax.scatter(xb,yb,label = "B", s = 20)
leg = ax.legend()
num = 0
color = ["r","g"]

#凡例マーカーに任意の色を付ける
for leha in leg.legendHandles:
    leha.set_color(color[num])
    num += 1
plt.show()

プロット色はオレンジ、青ですが凡例マーカーの色は赤、緑に変更することができました。

 

色の種類

ダミープロットの時にも紹介しましたが、再度指定できる色を紹介します。
色の横に文字が書いてありますが、その文字を指定すれば色指定OKです!../../_images/named_colors.png

matolotliカラーコード例 : https://matplotlib.org/examples/color/named_colors.html

一部文字は長い名前の場合と1文字で指定できる場合があります。
例えば赤の指定では以下のようにregまたはrで指定できます。

set_color("red") 
set_color("r")

以上の画像を参考に自分の好きな色を指定してみてください。

 

半透明なしで凡例マーカー表示

プロットは半透明あり、凡例のマーカー表示は半透明なしで行いたい時はset_alphaを使用して凡例の半透明設定を1つ1つ行います。

まず普通にプロットしたらもちろん凡例のマーカー表示も半透明になります。

通常パターン

import matplotlib.pyplot as plt

xa =[1,2,3]
xb = [5,6,7]

ya = [1,2,3]
yb = [5,6,7]

fig = plt.figure(figsize = (8,5))
ax = fig.add_subplot(1,1,1)
ax.scatter(xa,ya,label = "A", s = 20, alpha = 0.2)
ax.scatter(xb,yb,label = "B", s = 20, alpha = 0.2)
ax.legend()
plt.show()

 

次に凡例ハンドラにset_alphaで半透明設定を行います。

実行パターン

import matplotlib.pyplot as plt

xa =[1,2,3]
xb = [5,6,7]

ya = [1,2,3]
yb = [5,6,7]

fig = plt.figure(figsize = (8,5))
ax = fig.add_subplot(1,1,1)
ax.scatter(xa,ya,label = "A", s = 20, alpha = 0.2)
ax.scatter(xb,yb,label = "B", s = 20, alpha = 0.2)
leg = ax.legend()

#凡例表示でalphaを1.0にする
for leha in leg.legendHandles:
    leha.set_alpha(1.0)
plt.show()

プロットは半透明ですが、凡例のマーカー表示は半透明では無く表示できました!!

[スポンサーリンク]


コメント

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