是否可以重置Cycler对象

时间:2016-06-29 22:53:22

标签: python matplotlib

,如果lines1lines2的形状为(3,101)

 plt.plot(x, lines1, linewidth=3)
 plt.plot(x, lines2, linewidth=1)

我有一条宽度等于3的蓝色,绿色,红色线条,以及宽度等于1的青色,品红色和黄色线条。

由于lines1中的数据与lines2中的数据成对连接, 我想重置控制线路的Cycler对象'两条plot指令之间的颜色,以便我有蓝色,绿色,红色线条,宽度= 3,然后是蓝色,绿色,红色线条宽度= 1,并且两者之间存在视觉连接(颜色)线。

有问题的Cycler对象是axes的属性,恰好是prop_cycle属性

In [28]: plt.rcParams['axes.prop_cycle']
Out[28]: cycler('color', ['b', 'g', 'r', 'c', 'm', 'y', 'k'])

是否可以重置此Cycler对象?

2 个答案:

答案 0 :(得分:2)

提出问题意味着要更好地理解问题,不是吗?

下面的陈述可以解决问题,

plt.gca().set_prop_cycle(plt.rcParams['axes.prop_cycle'])

<edit>更简单,plt.gca().set_prop_cycle(None),请参阅下面的附录</edit>

matplotlib有内部一致性......

示例:

In [46]: %matplotlib
In [47]: import matplotlib.pyplot as plt
In [48]: import numpy as np
In [49]: x = np.linspace(0, 7, 101)
In [50]: y1 = np.array([np.sin(x+0.2*i*x) for i in range(2)])
In [51]: y2 = 0.9*y1+0.1
In [52]: plt.plot(x, y1.T, linewidth=3)
Out[52]: 
[<matplotlib.lines.Line2D at 0x7f5118b759b0>,
 <matplotlib.lines.Line2D at 0x7f5118b75b38>]
In [53]: plt.gca().set_prop_cycle(plt.rcParams['axes.prop_cycle'])
In [54]: plt.plot(x, y2.T, linewidth=1)
Out[54]: 
[<matplotlib.lines.Line2D at 0x7f511a3bec50>,
 <matplotlib.lines.Line2D at 0x7f5118b1e898>]
In [55]: 

enter image description here给了我

附录

最后,我阅读了.set_prop_cycle()

的文档字符串
  

在此Axes上为任何将来的绘图命令设置属性循环。

set_prop_cycle(arg)  
set_prop_cycle(label, itr)  
set_prop_cycle(label1=itr1[, label2=itr2[, ...]])  
     

表单1只设置给定的Cycler对象           [...]
  的参数
   arg :Cycler
  设置给定的Cycler   也可以None 重置到当前样式定义的循环           [...]

我的代码可以变得更简单

plt.plot(x, y1, linewidth=3)
plt.gca.set_prop_cycle(None)
plt.plot(x, y2, linewidth=1)

答案 1 :(得分:1)

plt.rcParams中的值是基础Cycler,但Axes个对象持有对该对象的迭代器的引用(请参阅here,它实际上是{{}在迭代器周围,所以它永远不会耗尽。)

如果您在剧情中使用广播,那么您可以执行类似

的操作
itertools.cycle

使用当前默认周期的子集

fig, ax = plt.subplots()
ax.set_prop_cycle((cycler('lw', [1, 3] *
                   cycler('color', ['b', 'g', 'r']))
ax.plot(x, lines1)
ax.plot(x, lines2)

(有关详细信息,请参阅the docs)将为您提供与上述相同的内容。

如果你可以一次循环一个数据,我的建议是做一些更通用的事情:

dflt_cy = plt.rcParams['axes.prop_cycle']
my_cy = cycler('lw', [1, 3]) * dflt_cy[:3]