Matplotlib:图例中的颜色编码文本而不是行

时间:2012-12-11 20:46:42

标签: python numpy matplotlib plot legend

在某些液晶显示器上,图例中水平线的颜色很难区分。 (见附图)。因此,不是在图例中画一条线,是否可以只对文本本身进行颜色编码?换句话说,蓝色为“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()

enter image description here

PS。如果线条可以在图例中变得更粗,但不在图中,那么这也可以。

4 个答案:

答案 0 :(得分:21)

我想知道同样的事情。以下是我想要改变图例中字体颜色的方法。我对这种方法并不完全满意,因为它看起来有点笨拙,但似乎完成了工作[编辑:见下面的更好方法]:

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

the colorful results

2016编辑:

实际上,还有更好的方法。您可以简单地遍历图例中的线条,这样可以避免在绘制线条时跟踪颜色。不那么笨重了。现在,改变线条颜色基本上是一个单行(好吧,它实际上是一个双线)。这是完整的例子:

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)

答案 1 :(得分:8)

通过图例文本getter / setter和轴线getter / setter完成所有绘图后,可以干净地完成此操作。在绘图之前,将图例文本颜色设置为与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()

在这个答案中要注意的主要区别是格式化绘图可以完全与绘图操作分离。

答案 2 :(得分:7)

只需设置图例句柄的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

答案 3 :(得分:1)

提供更通用的解决方案,使用图例句柄的颜色为图例文本着色: 这不仅适用于线条,也适用于传奇中的任何艺术家。它看起来如下:

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

enter image description here