2

我想绘制一些通过测量获得的数据,每个数据都适合。我将在每个图上绘制 6 个测量值,但我希望每个测量数据图都具有与其拟合相同的颜色。从一个测量数据图到下一个我想要 matplotlib 的默认颜色循环。

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

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() 调用到下一次,我需要正常的颜色增量。

4

2 回答 2

6

您可以基于每个轴设置颜色循环

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)。

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

于 2013-01-22T05:22:19.327 回答
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拟合线,颜色循环不会在“拟合”数据上增加。

于 2013-01-21T17:45:16.200 回答