18

特定のLCDモニターでは、凡例の水平線の色を区別するのが困難です。(添付の画像を参照してください)。では、凡例に線を引く代わりに、テキスト自体を色分けすることは可能ですか?つまり、「y = 0x」を青、「y=1x」を緑などにします。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)

ax.legend()

plt.show()

ここに画像の説明を入力してください

PS。凡例だけで線を太くすることができても、プロットでは太くできない場合は、これも機能します。

4

4 に答える 4

23

私は同じことを考えていました。これが、凡例のフォントの色を変更するために私が思いついたものです。この方法は少し不器用に見えるので、私は完全には満足していませんが、仕事は完了しているようです[編集:より良い方法については以下を参照してください]:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

colors = []
for i in xrange(5):
    line, = ax.plot(x, i * x, label='$y = %ix$' % i)
    colors.append(plt.getp(line,'color'))

leg = ax.legend()

for color,text in zip(colors,leg.get_texts()):
    text.set_color(color)

plt.show()

カラフルな結果

2016年編集:

実際には、もっと良い方法があります。凡例の線を繰り返すだけで、線がプロットされるときに色を追跡する必要がなくなります。はるかに不格好ではありません。さて、線の色を変更することは基本的に1つのライナーです(わかりました、それは実際には2つのライナーです)。完全な例は次のとおりです。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i*x, label='$y = %ix$'%i)

leg = ax.legend()

# change the font colors to match the line colors:
for line,text in zip(leg.get_lines(), leg.get_texts()):
    text.set_color(line.get_color())

plt.show()

2017編集:最後に、(タイトルが示すように)線の代わりに色分けされたテキストが本当に必要な場合は、次を使用して凡例の線を抑制することができます

 leg = ax.legend(handlelength=0)
于 2013-08-27T23:19:16.230 に答える
9

linewidth凡例ハンドルを設定するだけです。

In [55]: fig, ax = plt.subplots()

In [56]: x = np.arange(10)

In [57]: for i in xrange(5):                    
   ....:     ax.plot(x, i * x, label='$y = %ix$' % i)
   ....:     

In [58]: leg = ax.legend(loc='best')

In [59]: for l in leg.legendHandles:            
   ....:     l.set_linewidth(10)
   ....:     

legend_linewidth.png

于 2012-12-11T21:35:44.473 に答える
8

この操作は、すべてのプロットが凡例テキストゲッター/セッターおよび軸線ゲッター/セッターを介して行われた後、きれいに行うことができます。プロットする前に、凡例のテキストの色をforループの線の色と同じに設定します。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)

leg = ax.legend()

def color_legend_texts(leg):
    """Color legend texts based on color of corresponding lines"""
    for line, txt in zip(leg.get_lines(), leg.get_texts()):
        txt.set_color(line.get_color())  

color_legend_texts(leg)    

plt.show()

この回答で注意すべき主な違いは、プロットのフォーマットをプロット操作から完全に切り離すことができるということです。

于 2014-01-16T12:37:12.797 に答える
2

凡例のテキストを凡例のハンドルの色で色付けするためのより一般的な解決策を提供するには:これは、線だけでなく、凡例のすべてのアーティストに対して機能します。次のようになります。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)


ax.plot(x, 3 * x, label='$y = %ix$' % 3)
ax.scatter(x, 4 * x, color="red", label='$y = %ix$' % 4)
ax.hist(x, label="hist")
ax.errorbar(x,2*x,yerr=0.3*x, label='$y = %ix$' % 2)

leg = ax.legend()

for artist, text in zip(leg.legendHandles, leg.get_texts()):
    try:
        col = artist.get_color()
    except:
        col = artist.get_facecolor()
    if isinstance(col, np.ndarray):
        col = col[0]
    text.set_color(col)

plt.show()

ここに画像の説明を入力してください

于 2018-05-03T19:57:04.213 に答える