Matplotlib添加默认水印

iq0todco  于 2022-11-15  发布在  其他
关注(0)|答案(3)|浏览(163)

我在工作中使用matplotlib,公司的政策是在我们制作的每一张图上都包含水印。有没有办法将matplotlib设置为默认情况下这样做?
我目前正在将每个Axes对象传递给一个helper函数,该函数在左下角添加水印。

import matplotlib.pyplot as plt

def add_watermark(ax):
    ax.text(ax.get_xlim()[0] + 0.1, 
            ax.get_ylim()[0] + 0.1, 
            "<Company Name>", 
            alpha=0.5)

fig, ax = plt.subplots(1, 1)
x = np.fromiter((np.random.uniform() for _ in range(100)), dtype=np.float32)
y = np.fromiter((np.random.uniform() for _ in range(100)), dtype=np.float32)
ax.scatter(x, y)
add_watermark(ax)

我想修改matplotlib的默认行为,这样我就不必将每个axis示例传递给helper函数。

b1zrtrql

b1zrtrql1#

您可以轻松地对默认轴进行子类化和monkey-patch。

import matplotlib.axes
from matplotlib.offsetbox import AnchoredText

class MyAxes(matplotlib.axes.Axes):
    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)
        ab = AnchoredText("<company name>", loc="lower left", frameon=False,
                          borderpad=0, prop=dict(alpha=0.5))
        ab.set_zorder(0)
        self.add_artist(ab)

matplotlib.axes.Axes = MyAxes

然后将其导入到任何需要它的地方。

import matplotlib_company
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.show()

创建了

gk7wooem

gk7wooem2#

我认为最简洁的解决方案是在一个单独的python脚本(例如,名为companyplots.py)中创建一个“公司绘图模板”,该脚本位于python的模块搜索路径中。
您可以通过将其放在与实际绘图相同的文件夹中,或通过创建/some/path/to/user_modules文件夹并正确设置$PYTHONPATH变量以包括其路径来完成此操作。
在此文件中,收集所有必要的导入并使用默认绘图设置设置函数,例如:

def companyFigure((rows,cols),(width,height)=(768,576),dpi=72,fig_kwargs={}):
    """
    first, reset mpl style to default, then enforce a new one. 
    This is helpful when the new style does not overwrite *all* attributes 
    """
    style="ggplot" ##<- put your own style file here, if you have one
    mpl.rcParams.update(mpl.rcParamsDefault)
    mpl.style.use(style)

    ## that's your function:
    def add_watermark(ax):
        ax.text(ax.get_xlim()[0] + 0.1, 
                ax.get_ylim()[0] + 0.1, 
                "<Company Name>", 
                alpha=0.5)

    ## create figure with some arguments
    fig,ax=plt.subplots(rows,cols,
            figsize=(width/float(dpi),height/float(dpi)),
            dpi=dpi,
            **fig_kwargs
            )

    ## I'm presuming that you may want to have subplots somewhere down the line;
    ## for the sake of consistency, I'm thus making sure that "ax" is always a dict:
    if rows==1 and cols==1:
        ax={0:ax}

    for a in ax:
        add_watermark(a)

    return fig,ax

现在,只需运行以下命令,以后的所有打印都可以回退到该模板:

from companyplots import *

fig,ax=companyFigure((2,1),(500,300))
## do your plotting here...
plt.show()
wkyowqbh

wkyowqbh3#

从Matplotlib版本3.6和Seaborn 0.12开始,我用途:

def addwatermark(ax):
    """ Place watermark in bottom right of figure. """
    text = "<watermark>"
    ax.annotate(text, xy=(0.3, 0.1), xycoords='axes fraction', alpha=0.4, fontsize='large', rotation=45, fontweight=550)

您可以将其添加到单独的addwatermark.py文件中并调用from addwatermark.py import addwatermark
用法示例:

import matplotlib.pyplot as plt
from addwatermark.py import addwatermark

fig, ax = plt.subplots()
ax.plot(x=[1, 2, 3, 4, 5], y=[1, 2, 3, 4, 5])
addwatermark(ax)
plt.show()

还有Seaborn的作品:

import seaborn as sns
import matplotlib.pyplot as plt
from addwatermark.py import addwatermark
ax = sns.scatterplot(x=[1, 2, 3, 4, 5], y=[1, 2, 3, 4, 5])
addwatermark(ax)
plt.show()

如果在Seborn中使用facetgridpairgrid,则可以通过其属性ax访问轴。
Matplotlib也有一个example,但它不适用于Seborn。

相关问题