如何在一个图中为不同的地块绘制不同的彩色线条?

我正在使用matplotlib来创build情节。 我必须用Python自动生成的不同颜色识别每个图。

你能给我一个方法,把不同的情节不同的颜色在同一个数字?

Matplotlib默认是这样做的。

例如:

 import matplotlib.pyplot as plt import numpy as np x = np.arange(10) plt.plot(x, x) plt.plot(x, 2 * x) plt.plot(x, 3 * x) plt.plot(x, 4 * x) plt.show() 

展示颜色循环的基本情节

而且,正如您可能已经知道的那样,您可以轻松地添加一个图例:

 import matplotlib.pyplot as plt import numpy as np x = np.arange(10) plt.plot(x, x) plt.plot(x, 2 * x) plt.plot(x, 3 * x) plt.plot(x, 4 * x) plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left') plt.show() 

与传说的基本情节

如果你想控制将要循环的颜色:

 import matplotlib.pyplot as plt import numpy as np x = np.arange(10) plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow']) plt.plot(x, x) plt.plot(x, 2 * x) plt.plot(x, 3 * x) plt.plot(x, 4 * x) plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left') plt.show() 

显示对默认颜色循环的控制

希望那有所帮助! 如果你不熟悉matplotlib, 那么教程是一个很好的开始 。

编辑:

首先,如果你想在一个图上绘制很多东西(> 5),可以select:

  1. 把它们放在不同的地块上(考虑在一个图上使用几个子图),或者
  2. 使用颜色以外的东西(即标记样式或线条粗细)来区分它们。

否则,你会结束一个非常凌乱的情节! 对任何人要阅读你正在做的事情感到高兴,不要试图将15种不同的东西塞进一个数字!

除此之外,许多人不同程度的色盲,区分众多微妙的不同颜色是比你可能意识到的更难的人。

如前所述,如果你真的想用20个相对不同的颜色在一个轴上放20行,这里有一个办法:

 import matplotlib.pyplot as plt import numpy as np num_plots = 20 # Have a look at the colormaps here and decide which one you'd like: # http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html colormap = plt.cm.gist_ncar plt.gca().set_color_cycle([colormap(i) for i in np.linspace(0, 0.9, num_plots)]) # Plot several different functions... x = np.arange(10) labels = [] for i in range(1, num_plots + 1): plt.plot(x, i * x + 5 * i) labels.append(r'$y = %ix + %i$' % (i, 5*i)) # I'm basically just demonstrating several different legend options here... plt.legend(labels, ncol=4, loc='upper center', bbox_to_anchor=[0.5, 1.1], columnspacing=1.0, labelspacing=0.0, handletextpad=0.0, handlelength=1.5, fancybox=True, shadow=True) plt.show() 

根据给定的颜色映射,20行的独特颜色

稍后设置它们

如果您不知道要绘制的图的数量,可以在绘制图之后更改颜色,使用.lines直接从图中检索数字,我使用以下解决scheme:

一些随机数据

 import matplotlib.pyplot as plt import numpy as np fig1 = plt.figure() ax1 = fig1.add_subplot(111) for i in range(1,15): ax1.plot(np.array([1,5])*i,label=i) 

你需要的一段代码:

 colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))] for i,j in enumerate(ax1.lines): j.set_color(colors[i]) ax1.legend(loc=2) 

结果如下: 在这里输入图像说明

我想对上一篇文章给出的最后一个循环答案作一个小小的改进(该文章是正确的,应该仍然被接受)。 标记最后一个示例时所隐含的假设是, plt.label(LIST)将标签号X置于LIST ,并调用对应于第X个时间plot的线。 之前我遇到过这种方法的问题。 推荐的方式来构build传奇,并根据matplotlibs文档( http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item )自定义标签,这是一个温暖的感觉,标签去以及你认为他们的确切情节:

 ... # Plot several different functions... labels = [] plotHandles = [] for i in range(1, num_plots + 1): x, = plt.plot(some x vector, some y vector) #need the ',' per ** below plotHandles.append(x) labels.append(some label) plt.legend(plotHandles, labels, 'upper left',ncol=1) 

**: Matplotlib传奇不工作