Matplotlib: 色彩编码的图例文本而非线性

2024-09-30 18:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

在某些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()

enter image description here

如果这条线可以在传说中变粗,而不是在情节中变粗,这也会起作用。


Tags: 文本importlcd颜色asnppltax
3条回答

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

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

我也在想同样的事。这是我想出的改变传奇字体颜色的方法。我对这种方法并不完全满意,因为它看起来有点笨拙,但似乎完成了工作[编辑:查看下面的更好方法]:

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)

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

相关问题 更多 >