【问题标题】:Matplotlib - savefig ignores facecolor when saving with transparencyMatplotlib - savefig 在以透明度保存时忽略 facecolor
【发布时间】:2018-11-22 17:38:59
【问题描述】:

我惊讶地发现,当我将savefigtransparent=True 一起使用时,这会删除我可能设置的facecolor

我怎样才能不丢失我手动设置的任何背景颜色(包括白色)?

比较

图形用户界面

使用transparent=False

plt.savefig('temp.pdf', format='pdf', transparent=False, bbox_inches='tight')

使用transparent=True

plt.savefig('temp.pdf', format='pdf', transparent=True, bbox_inches='tight')

MWE

import matplotlib as mpl

rc_fonts = {
    "text.usetex": True,
    'text.latex.preview': True,
    "font.size": 50,
    'mathtext.default': 'regular',
    'axes.titlesize': 55,
    "axes.labelsize": 55,
    "legend.fontsize": 50,
    "xtick.labelsize": 50,
    "ytick.labelsize": 50,
    'figure.titlesize': 55,
    'figure.figsize': (10, 6.5),  # 15, 9.3
    'text.latex.preamble': [
        r"""\usepackage{lmodern,amsmath,amssymb,bm,physics,mathtools,nicefrac,letltxmacro,fixcmex}
        """],
    "font.family": "serif",
    "font.serif": "computer modern roman",
}
mpl.rcParams.update(rc_fonts)
import matplotlib.pylab as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes, InsetPosition, mark_inset
from numpy import linspace, sin


x = linspace(0, 1, 100)
plt.clf()
ax1 = plt.gca()
ax2 = plt.axes([0, 0, 1, 1], label=str(2))
ip = InsetPosition(ax1, [0.08, 0.63, 0.45, 0.3])
ax2.set_axes_locator(ip)
ax1.plot(x, x)
ax1.plot(x, x + 0.3)
ax1.set_xlim(0, 1)
ax1.set_ylim(0, 1)
plt.setp(ax2.get_xticklabels(), backgroundcolor="white")
ax2.set_facecolor('grey')
ax1.set_yticks([])
ax1.set_xticks([])
ax2.set_yticks([])
ax1.text(0.3, 0.3, '$1$', transform=ax1.transAxes, horizontalalignment='center', verticalalignment='center', color='black', backgroundcolor='white')

期望的输出

我希望任何背景颜色都默认为None(或类似),这样如果未指定,则它将是透明的,如果指定了,则将受到尊重且不透明。因此,我想要以下输出(使用蓝色背景以增加清晰度):

我想要什么:

目前,如果我使用facecolor=(1,1,1,0),它会正确移除边缘周围的所有颜色,但主绘图区域仍然是白色。

【问题讨论】:

  • 透明,根据定义,将所有轴背景设置为透明 - 因此得名。你为什么要首先使用它?
  • 我的一些人物出现在带有彩色背景的海报或网站上,如果背景颜色匹配,它看起来会更好。 (尽管我不得不更加厌倦填充任何背景颜色,如果有的话)。
  • 但在海报上,您希望图形背景透明,而不是轴,对吧?或者主轴也应该是透明的?我有一个open issue,关于 savefig 参数具有误导性;但是对于任何情况都有一种解决方法。如果这在阅读问题时没有变得明显,我可以在这里给出答案,如果你告诉哪些元素应该是透明的或删除的,哪些不是。另外你是如何准备海报的?通过特克斯?还是图形程序?
  • @ImportanceOfBeingErnest --- 我添加了一个所需输出的示例,希望能更清楚地说明这一点(我想我对图形/轴/绘图区域有点困惑)。您的未解决问题帮助我取得了一些进展,但不是全部。海报是使用 LaTeX 准备的,尽管对于网站,我只会输出允许透明度的适当图像格式。

标签: python matplotlib background


【解决方案1】:

看起来您可以通过

获得所需的输出
ax1.set_facecolor((1,1,1,0))
ax2.set_facecolor("grey")
fig.savefig(__file__+".pdf", facecolor=(1,1,1,0))

【讨论】:

  • 这没有达到预期的效果。如果我将这四行放在最后(并且在调用plt.clf() 之后有一个前导fig = plt.gcf()),那么我得到的主要人物仍然具有白色且不透明的背景。
  • 对,我把自己弄糊涂了,你也一样,对此感到抱歉。现在答案中的代码应该可以工作了。
  • 那么在您看来,这种行为是否可以预期,是否有据可查?我意识到您在 linked issue 中对 frameon 的评论具有误导性。必须设置所有这些facecolor 值似乎有点混乱。如果我正确地关注了你的问题,这似乎是frameon 的工作。
  • 是的。所以我想改变这种行为,但我还没有付出任何努力。关于是否删除savefig的所有论点也存在一些争议,我会反对。
猜你喜欢
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2017-11-01
  • 2016-05-23
  • 1970-01-01
相关资源
最近更新 更多