Python Matplotlib:图例中的颜色编码文本,而不是线条
在某些LCD显示器上,图例中水平线的颜色很难区分。(见附图)。因此,与其在图例中画一条线,是否可以只对文本本身进行颜色编码?换句话说,蓝色是“y=0x”,绿色是“y=1x”,等等Python Matplotlib:图例中的颜色编码文本,而不是线条,python,numpy,matplotlib,plot,legend,Python,Numpy,Matplotlib,Plot,Legend,在某些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
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()
注:如果图例中的线条可以加粗,但在绘图中不加粗,这也会起作用。只需设置图例手柄的
线宽即可:
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)
....:
我也在想同样的事情。下面是我在图例中更改字体颜色的方法。我对这种方法不太满意,因为它看起来有点笨拙,但似乎可以完成工作[编辑:请参见下面的更好方法]:
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年编辑:
事实上,还有更好的办法。您可以简单地在图例中的线条上迭代,这样就避免了在绘制线条时需要跟踪颜色。更不笨重。现在,更改线条颜色基本上是一行(好的,实际上是两行)。以下是完整的示例:
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)
通过图例文本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()
此答案中需要注意的主要区别是,可以将打印格式与打印操作完全分离。要提供更通用的解决方案,以使用图例手柄的颜色为图例文本着色,请执行以下操作:
这不仅适用于线条,也适用于传奇中的任何艺术家。情况如下:
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()
这并不能回答问题。应改为接受。从matplotlib 3.3.0版开始,您现在可以直接使用关键字参数labelcolor
,如本答案所述: