Matplotlib的fill_between函数不会循环使用颜色。

7

大多数绘图方法,如plot()和errorbar()在同一张图上绘制多个数据时会自动切换到color_palette中的下一个颜色。但不知为何,fill_between()不会这样做。我知道可以硬编码解决,但由于是在循环中进行的,所以这很麻烦。有没有什么好的方法来解决这个问题?

import numpy as np
import matplotlib.pyplot as plt

x = np.asarray([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.asarray([1.0, 2.0, 3.0, 4.0, 5.0])
xerr = np.asarray([0.2, 0.4, 0.6, 0.8, 1.0])
yerr = np.asarray([0.1, 0.2, 0.3, 0.4, 0.5])

plt.fill_between(x, y-yerr, y+yerr,alpha=0.5)
plt.fill_between(y,x-xerr,x+xerr,alpha=0.5)

plt.show() 

也许仅仅获取当前调色板的位置并迭代到下一个位置就足够了。
2个回答

3
奇怪的是,即使明确调用 ax._get_patches_for_fill.set_color_cycle(clist)ax.set_color_cycle(np.roll(clist, -1)) ,也似乎不能恢复颜色循环(参见这个答案)。可能是因为填充之间不创建常规的图案或线条对象(或者可能是一个错误?)。无论如何,您可以像在轴函数 ax.set_color_cycle 中一样手动调用颜色循环。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams
import itertools

clist = rcParams['axes.color_cycle']
cgen = itertools.cycle(clist)

x = np.asarray([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.asarray([1.0, 2.0, 3.0, 4.0, 5.0])
xerr = np.asarray([0.2, 0.4, 0.6, 0.8, 1.0])
yerr = np.asarray([0.1, 0.2, 0.3, 0.4, 0.5])

fig, ax = plt.subplots(1,1)
ax.fill_between(x, y-yerr, y+yerr,alpha=0.5, facecolor=cgen.next())
ax.fill_between(y,x-xerr,x+xerr,alpha=0.5, facecolor=cgen.next())

plt.show() 

2
关于颜色循环的具体处理方式以及不同情况下的差异性并不十分一致。从用户角度来看,已有一个相关问题的解决方案正在进行中,可以在以下链接中查看:https://github.com/matplotlib/matplotlib/pull/4258 - tacaswell

2
在Matplotlib 3.3.3中,需要遵循Ed Smith建议的语法调整:
clist = rcParams['axes.prop_cycle']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接