Matplotlib fill_between中facecolor alpha与edgecolor alpha有什么区别?

9
有没有办法分别为facecoloredgecolor指定不同的alpha值?或者有没有一种方法可以绘制一个填充了alpha值的区域,并具有非alpha边缘颜色,同时在图例中也能正常显示?
这不是我想要的... enter image description here
axs.fill_between(xvalues, tupper_w, tlower_w, facecolor='dimgray', edgecolor='dimgray', alpha=0.25, label='$measured\quad\sigma$')
axs.fill_between(xvalues, pupper_w, plower_w, facecolor='orange', edgecolor='orange', alpha=0.25, label='$predicted\quad\sigma$')
axs.plot(xvalues, tcurvesavg_w, color='dimgray', label='$\overline{measured}$', ls='--')
axs.plot(xvalues, pcurvesavg_w, color='orange', label='$\overline{predicted}$', ls='--')

这是我想要的(但需要适当的图例):在此输入图片描述

axs.fill_between(xvalues, tupper, tlower, facecolor='dimgray', alpha=0.25, label='$measured\quad\sigma$')
axs.fill_between(xvalues, pupper, plower, facecolor='orange', alpha=0.25, label='$predicted\quad\sigma$')
axs.plot(xvalues, tupper, color='dimgray', lw=0.5)
axs.plot(xvalues, tcurvesavg, color='dimgray', label='$\overline{measured}$', ls='--')
axs.plot(xvalues, tlower, color='dimgray', lw=0.5)
axs.plot(xvalues, pupper, color='orange', lw=0.5)
axs.plot(xvalues, pcurvesavg, color='orange', label='$\overline{predicted}$', ls='--')
axs.plot(xvalues, plower, color='orange', lw=0.5)
2个回答

13

您无法通过alpha参数指定不同的透明度值。但是,您可以为每个facecoloredgecolor定义一个Alpha通道,例如对于40%不透明度的红色。

facecolor=(1,0,0,.4)

然后直接应用于图例中。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0.0, 2, 0.01)
y1 = np.sin(2*np.pi*x)
y2 = 1.2*np.sin(4*np.pi*x)-.9

fig, ax = plt.subplots()

ax.fill_between(x, y1, y1+.5, facecolor=(1,0,0,.4), edgecolor=(0,0,0,.5), label="Label 1")
ax.fill_between(x, y2, y2-.5, facecolor=(0,0,1,.4), edgecolor=(0,0,0,.5), label="Label 1")

ax.legend()
plt.show()

在这里输入图片描述


1

看起来fill_between alpha和通用的fill_between documentation都不被支持。图例文档似乎也没有提供在绘图后添加边框的选项。

在您的第二个代码片段中,如果您能够找出如何让绘图和填充函数具有单个句柄,则图例应该会自动格式化。类似于以下内容(改编自此类似但不完全重复的StackExchangePost):

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import numpy as np

xvalues = np.linspace(0,1,11)
tcurvesavg = np.linspace(0,1,11)
p1, = plt.plot(xvalues, tcurvesavg , c='r')  # notice the comma!
p2 = plt.fill_between(xvalues, tcurvesavg -0.2, tcurvesavg +0.2, color='r', alpha=0.5)
plt.legend(((p1,p2),), ('Entry',))
plt.show()

作为大多数matplotlib问题的非自动化解决方法,将其保存为svg(类似于this post),并在矢量图形程序(如Inkscape)中添加边框。您不应该失去分辨率,并且仍然可以将其放入报告等中。


我会尝试一下,谢谢!如果找不到程序解决方案,我会进行后处理。我正在生成所有实验中数百个不同的图表,所以我想确保从一开始就能正常工作。但有时候后处理是必要的 :/ - delrocco
1
@delrocco 的回答完全符合你的需求,你应该将其标记为已采纳。 - Guimoute

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