你问题的答案与另外两个SO问题有关。
但是,您需要得到正确的颜色列表,这是使用颜色映射最容易完成的,正如对这个问题的回答中所解释的那样: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=[...])。
本文介绍了如何在Python中利用matplotlib库为超过20种图形分配不同的颜色。通过颜色映射和颜色循环,可以实现对每个线条的唯一颜色设定。示例代码展示了两种方法,一种是直接使用颜色映射,另一种是通过ScalarMappable对象进行颜色转换。最终,这两种方法都能生成包含20种不同颜色的图表。
1188

被折叠的 条评论
为什么被折叠?



