保存时Matplotlib图facecolor alpha(背景颜色,透明度)

sch*_*dge 7 python matplotlib scipy

之前的一个问题涉及使用savefig()与屏幕上显示的相同的facecolor(背景颜色)进行保存,即:

fig = plt.figure()
fig.patch.set_facecolor('blue')
fig.savefig('foo.png', facecolor=fig.get_facecolor())
Run Code Online (Sandbox Code Playgroud)

Matplotlib图facecolor(背景颜色)

(使用时savefig()需要我们重新指定背景颜色.)

我还可以为透明度指定alpha,例如:如何使用Matplotlib设置图形背景颜色的不透明度

fig.patch.set_alpha(0.5)

我无法找到一种方法来使用透明的facecolor保存图形,因为它出现在屏幕上.文档似乎不完整:http : //matplotlib.org/faq/howto_faq.html#save-transparent-figures - 实际保存未显示.使用transparent=Truewith savefig()没有使facecolor透明化所需的效果,相反它似乎使除了轴标题之外的所有内容都透明在该颜色之上(包括图形背景).

编辑:代码的一些相关摘录:

def set_face_color(fig, facecolor):
    if facecolor is False:
        # Not all graphs get color-coding
        facecolor = fig.get_facecolor()
        alpha = 1
    else:
        alpha = 0.5
    color_with_alpha = colorConverter.to_rgba(
        facecolor, alpha)
    fig.patch.set_facecolor(color_with_alpha)

def save_and_show(plt, fig, save, disp_on, save_as):
    if save:
        plt.savefig(save_as, dpi=dpi_file, facecolor=fig.get_facecolor(),
                    edgecolor='none')
    if disp_on is True:
        figManager = plt.get_current_fig_manager()
        figManager.window.showMaximized()
        plt.show()
    else:
        plt.close('all')
Run Code Online (Sandbox Code Playgroud)

有可能将它们组合在一起,但set_face_color()在构建子图的网格然后save_and_show()到最后之前,我经常在图形函数的开头调用.我想它应该可以在任何一个地方工作,但最佳的是我更喜欢保持功能分离,并能够savefig()从最终的无花果中提取alpha .

编辑2 - 值得千言万语

左边是Alpha = 0.5,右边是1.

下面的代码图片

t = [1, 2, 3, 4, 5]
fig = plt.figure()
fig.patch.set_alpha(0.5)
fig.set_facecolor('b')
plt.plot(t, t)
fig2 = plt.figure()
fig2.set_facecolor('b')
plt.plot(t,t)
Run Code Online (Sandbox Code Playgroud)

Ian*_*nhi 5

我在 Matplotlib 1.5 上运行了你的代码,发现它产生了我预期的输出。对于未来发生的所有事情,我在下面给出了两种简洁的方法来实现这一目标。

快速说明一下,您绝对不想设置transparent=True为 savefig 的选项,因为这将覆盖面颜色,如您在 matplotlib.figure.savefig中看到的那样。

为了真正解决您的问题,您发布的第二个链接How to set opacity of background color of graph wit Matplotlib实际上解决了问题。问题中的代码片段的问题是使用fig.set_facecolor而不是fig.patch.set_facecolor

修复1:

从上面链接的问题使用facecolor参数来savefig

import matplotlib.pyplot as plt

fig = plt.figure()
fig.patch.set_facecolor('b') # instead of fig.patch.set_facecolor
fig.patch.set_alpha(0.5)

plt.plot([1,3], [1,3])
plt.tight_layout()
plt.show()
plt.savefig('method1.png', facecolor=fig.get_facecolor())
Run Code Online (Sandbox Code Playgroud)

修复2:

您还可以通过 rcParams 指定 savefig 的面颜色。

import matplotlib.pyplot as plt
import matplotlib as mpl

fig = plt.figure()

col = 'blue'
#specify color of plot when showing in program. 
#fig.set_facecolor(col) also works
fig.patch.set_facecolor(col)
#specify color of background in saved figure
mpl.rcParams['savefig.facecolor'] = col 

#set the alpha for both plot in program and saved image
fig.patch.set_alpha(0.5)
plt.plot([1,3], [1,3])
plt.tight_layout()
plt.show()
plt.savefig('method2.png')
Run Code Online (Sandbox Code Playgroud)

如果您希望您的轴有背景,这些解决方案应该保持该背景(例如 Erotemic 的评论中由seaborn 生成的)完好无损。如果你想更明确地添加:

ax.patch.set_color('palegoldenrod') # or whatever color you like
ax.patch.set_alpha(.7)
Run Code Online (Sandbox Code Playgroud)

轴补丁 alpha 将无需额外努力即可转移到 savefig。

请注意,在这两种情况下,我都用来plt.tight_layout()消除保存的图形中无用的额外空间。您可以在 matplotlib文档中阅读更多相关内容。