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))
如您所见,这两行都是蓝色的-我可以理解,这是因为每个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)
但是如果我尝试重用相同的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中的事情比我的哲学梦想中的要多。
答案 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
控制的所有属性相同的循环。