Matplotlib图形的facecolor alpha在保存时如何设置(背景颜色,透明度)

11

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

fig = plt.figure()
fig.patch.set_facecolor('blue')
fig.savefig('foo.png', facecolor=fig.get_facecolor())

Matplotlib图形的面颜色(背景颜色)

(使用savefig()需要重新指定背景颜色。)

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

fig.patch.set_alpha(0.5)

我找不到一种方法使带有透明背景颜色的图形保存为屏幕上显示的样子。文档对此似乎不完整:http://matplotlib.org/faq/howto_faq.html#save-transparent-figures - 实际保存并未展示。使用savefig()transparent=True无法使面颜色透明,相反,它似乎会使除轴图例以外的所有东西都变成该颜色的透明度(包括图形背景)。

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

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')

可能可以将它们合并,但我经常在绘图函数的开头调用set_face_color(),然后建立一系列子图格栅结构,并在最后调用save_and_show()。我猜它应该可以在任何位置都能工作,但最好保持函数分离,从最终图中提取alpha值传递给savefig()
编辑2-一图胜千言
左侧Alpha = 0.5,右侧为1。 image of code below
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)

我猜你想要一个具有透明背景的图形是吗?无论如何,你应该能够使用4元组的RGBA颜色参数来设置面颜色,即 facecolor=(1, 1, 1, 0) - David Zwicker
只是使用alpha来渲染颜色,我稍微使用了一点(alpha = 0.5对于这段代码)。我尝试使用colorConverter.to_rgba(),这样我就可以只使用set_facecolor()而跳过set_alpha(),但显然fig.savefig(..., facecolor=fig.get_facecolor())要么不返回4元组,要么忽略alpha。我在程序的其他地方设置了facecolor - 将其编码为数据值,以便当我翻阅绘图时可以快速排序 - 因此,虽然我可以携带该值并稍后将其传递给savefig,但我最希望能够从fig中提取它。 - schodge
我不确定你想要实现什么。你能在原帖中添加一张图片吗? - David Zwicker
我遇到了相同的问题。在我的情况下,我有一个白色背景图,但我的轴背景是灰色的。当我使用transparent=True保存时,图形和轴都会被赋予完全透明的背景。但我希望我的坐标轴是灰色的。这个帖子很久了,但也许有人能够帮助?我上传了一个有和没有透明度的例子:http://imgur.com/a/aR3TF 我想要matplotlib保留我的灰色轴背景,但它却删除了它。 - Erotemic
1个回答

5
我在Matplotlib 1.5上运行了您的代码,并发现它为我产生了预期的输出。为了将来发生的所有事情,我在下面提供了两种简洁的方法来实现这一点。
一个快速的注意事项是,您绝对不想将transparent=True设置为savefig的选项,因为这将覆盖facecolors,正如您可以在matplotlib.figure.savefig source中看到的那样。
要实际解决您的问题,您发布的第二个链接How to set opacity of background colour of graph wit Matplotlib实际上解决了这个问题。问题在于问题中代码片段使用了fig.set_facecolor而不是fig.patch.set_facecolor 修复1:
从上面链接的问题中使用facecolor参数来保存图像。
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())

修复2:

您还可以通过rcParams指定savefig的facecolor。

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')

如果您希望您的轴具有背景,这些解决方案应该保留该背景(例如Erotemic评论中seaborn生成的背景)。如果您想更明确地说明,请添加:
ax.patch.set_color('palegoldenrod') # or whatever color you like
ax.patch.set_alpha(.7)

轴线补丁的alpha值会在不需要额外努力的情况下传递到savefig。请注意,在这两种情况下,我都使用了plt.tight_layout()来消除保存的图中无用的额外空间。您可以在matplotlib文档中阅读更多相关信息documentation

谢谢。此时我不确定我使用的Matplotlib版本是什么-可能是基于日期推断出的1.3.1版本。现在知道可以按预期工作,感谢您详细的解释。 - schodge

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