2013-01-21 77 views
2

我想绘制一些数据,通过测量获得每个与他们的适合。 我会在每张图上绘制6个测量图,但我希望每个测量数据图都具有与其拟合相同的颜色。从一个测量数据图到下一个我需要matplotlib的defalut颜色循环。pyplot.plot()修改线条颜色循环

首先,如果加载以下数据:

import matplotlib.pyplot as plt 
import matplotlib as mpl 
import numpy as np 
data1 = np.genfromtxt('data1.txt') 
fit1 = np.genfromtxt('fit1.txt') 
... 

那么问题,我当然可以重新定义颜色顺序rcParams,如下所示:

ColourSeq = [] 
ColourSeqOriginal = mpl.rcParams['axes.color_cycle'] 
for ind in range(len(ColourSeqOriginal)): 
    ColourSeq.append(ColourSeqOriginal[ind]) 
    ColourSeq.append(ColourSeqOriginal[ind]) 
mpl.rcParams['axes.color_cycle'] = ColourSeq 

但这种看似复杂。

最简单的事情似乎是:

plt.figure() 
plt.plot(xdata, data1, xdata, fit1, '???') 
plt.plot(xdata, data2, xdata, fit2, '???') 
plt.plot(xdata, data3, xdata, fit3, '???') 

'???'作为命令选项,我不知道是否存在会阻止plt.plot递增给定数据的颜色值的命令选项。 但从一个plt.plot()调用到下一个,我需要有正常的颜色增量。

回答

5

您可以设置颜色周期在每个轴的基础

ax = plt.gca() 
ax.set_color_cyle(['r','r','b','b',..]) 

一个更清洁的方式做的是这样的:

import itertools 
colors_ = ['r','b','g','m','k'] # change to what colors you want 

datas = [data1, data2, data3] 
fits = [fit1, fit2, fit3] 
ax = plt.gca() 
for d, f, c in zip(datas, fits, itertools.cycle(colors_)): 
    ax.plot(xdata, d, color=c) 
    ax.plot(xdata, f, color=c) 

这使您能够控制准确习惯它的颜色,和如果你决定改变你的数据绘图方式,你只需要改变一次,而不是N次。您还可以轻松添加额外的列表(如标签列表,标记类型,线条样式等),以控制线条的绘制方式。 (itertools.cycle用于确保颜色永远不是zip中的限制迭代)。

自动循环有利于原型制作,但您应该养成为实际绘图指定颜色的习惯。

+0

有趣的一点是,matplotlib使用itertools.cycle()来遍历rcParams中的默认颜色。 – Phil

+0

@ user1850133确实,谢谢。你也可以通过界面建议编辑(你得到它的代表)。 – tacaswell

+0

只要我发布我的评论,我发现你通过添加缺少的'in'来纠正你的帖子,所以我删除了我的评论。下次我会继续。 – user1850133

2

plot()没有任何参数会强制单次调用plot()中的所有行的颜色相同。防止颜色循环增加的唯一方法是使用color='x'指定颜色。

这里是一个替换的方法,其可以为你工作:

ax = plt.gca() 
ax.plot(xdata, data1) 
ax.plot(xdata, fit1, color=ax.lines[-1].get_color()) 
ax.plot(xdata, data2) 
ax.plot(xdata, fit2, color=ax.lines[-1].get_color()) 
ax.plot(xdata, data3) 
ax.plot(xdata, fit3, color=ax.lines[-1].get_color()) 

通过指定拟合线的color,颜色周期不递增上的“匹配”的数据。

+0

你能否让你的建议更一致?什么是斧头? get_color()? – user1850133

+0

我很抱歉,'ax'是你正在绘制的坐标轴。 'get_color()'只是返回一行中的颜色属性。 – Phil

+0

这与我正在寻找的内容非常匹配,尽管我期待着比color = ax.lines [-1] .get_color()更简单的命令。无论如何,这是matplotlib ......谢谢。 – user1850133