一个“图”,许多“轴”,一个“ prop_cycle”

时间:2018-12-08 10:58:13

标签: matplotlib

Answering著名的问题"How to get different colored lines for different plots in a single figure?"我偶然发现了令我困惑的行为……

问题是在不同的子图中获得不同的线条颜色, 像这样

In [29]: import numpy as np 
    ...: import matplotlib.pyplot as plt                                                  

In [30]: fig, axes = plt.subplots(2,1)                                                    

In [31]: for ax in axes.flatten(): 
    ...:     ax.plot((0,1), (0,1))                                                        

enter image description here

如您所见,这两行都是蓝色的-我可以理解,这是因为每个ax都有自己的prop_cycle

我可以使用明确的颜色名称来解决问题

In [44]: fig, axes = plt.subplots(2,1)                                                    

In [45]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'): 
    ...:     ax.plot((0,1), (0,1), short_color_name)                                      

enter image description here

但是如果我尝试重用相同的cycler对象...

In [47]: my_cy = plt.rcParams['axes.prop_cycle']                                          

In [48]: for ax in axes.flatten(): 
    ...:     ax.set_prop_cycle(my_cy) 
    ...:     ax.plot((0,1), (0,1))                                                        

我有两个带有两条蓝线的子图...

根据我的理解,我想做的事是不可能的,因为ax 会调用循环程序返回一个itertools.cycle,而该循环实际上会产生{{1 }},但我还是问

  

Matplotlib中的事情比我的哲学梦想中的要多。

2 个答案:

答案 0 :(得分:1)

如果您只有一位歌手需要样式,我的建议是

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2,2)
cycler = plt.rcParams['axes.prop_cycle']()

for i, ax in enumerate(axes.flat):
    ax.plot((0,1), (0,1), **next(cycler))

plt.show()

答案 1 :(得分:0)

this comment提示,我想提出

...
next_shared_style = plt.rcParams['axes.prop_cycle']().__next__
for i, ax in enumerate(axes):
    ax.plot(x, y[i], **next_shared_style())

其中

  • plt.rcParams['axes.prop_cycle']cycler对象,
  • plt.rcParams['axes.prop_cycle']()返回一个itertools.cycle对象,并且
  • next_shared_style = plt.rcParams['axes.prop_cycle']().__next____next__对象的itertools.cycle方法。

每次调用next(my_cycle_object_as_instantiated_by_a_cycler)都会返回一个参数字典,以便将该字典正确传递给pyplot绘图命令,我们只需对其解压,如
plot(x, y[i], **next_shared_style())

使用整个字典可确保每个子图共享受prop_cycle控制的所有属性相同的循环。