使用 matplotlib 创建超过 20 种独特的图例颜色
·
回答问题
我正在使用 matplotlib 在一个图上绘制 20 条不同的线。我使用 for 循环来绘制并用其键标记每一行,然后使用图例函数
for key in dict.keys():
plot(x,dict[key], label = key)
graph.legend()
但是使用这种方式,图表会在图例中重复很多颜色。有什么方法可以确保使用 matplotlib 和超过 20 行为每一行分配唯一的颜色?
谢谢
Answers
您的问题的答案与另外两个 SO 问题有关。
的答案 如何为matplotlib中的一个图中的每条绘制的线选择一种新的颜色?解释了如何定义默认的颜色列表,该列表循环选择下一个要绘制的颜色。这是通过Axes.set_color_cycle方法完成的。
但是,您希望获得正确的颜色列表,这最容易使用颜色图来完成,正如对这个问题的回答中所解释的那样:Create a color generator from given colormap in matplotlib。有一个颜色映射表取一个从 0 到 1 的值并返回一个颜色。
因此,对于您的 20 行,您希望以 1/20 的步长从 0 循环到 1。具体来说,您希望从 0 循环到 19/20,因为 1 映射回 0。
这是在此示例中完成的:
import matplotlib.pyplot as plt
import numpy as np
NUM_COLORS = 20
cm = plt.get_cmap('gist_rainbow')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_color_cycle([cm(1.*i/NUM_COLORS) for i in range(NUM_COLORS)])
for i in range(NUM_COLORS):
ax.plot(np.arange(10)*(i+1))
fig.savefig('moreColors.png')
plt.show()
这是结果图:

替代的,更好的(有争议的)解决方案
还有一种替代方法是使用ScalarMappable对象将一系列值转换为颜色。这种方法的优点是您可以使用非线性Normalization将线索引转换为实际颜色。以下代码产生相同的确切结果:
import matplotlib.pyplot as plt
import matplotlib.cm as mplcm
import matplotlib.colors as colors
import numpy as np
NUM_COLORS = 20
cm = plt.get_cmap('gist_rainbow')
cNorm = colors.Normalize(vmin=0, vmax=NUM_COLORS-1)
scalarMap = mplcm.ScalarMappable(norm=cNorm, cmap=cm)
fig = plt.figure()
ax = fig.add_subplot(111)
# old way:
#ax.set_color_cycle([cm(1.*i/NUM_COLORS) for i in range(NUM_COLORS)])
# new way:
ax.set_color_cycle([scalarMap.to_rgba(i) for i in range(NUM_COLORS)])
for i in range(NUM_COLORS):
ax.plot(np.arange(10)*(i+1))
fig.savefig('moreColors.png')
plt.show()
弃用说明
在 mplib (1.5+) 的更新版本中,set_color_cycle函数已被弃用,取而代之的是ax.set_prop_cycle(color=[...])。
更多推荐

所有评论(0)