将默认变量传递给 matplotlib

Pass default variables to matplotlib

我正在创建一些函数来使用 matplotlib 创建标准形式的高质量图形。我通常创建线图、等高线图等。有没有办法将参数(轴限制、刻度位置等)传递给 matplotlib,指示 matplotlib 使用参数的默认值?例如

我创建了一个class

class my_class(object):
    xlimit = *something matplotlib reads as "use default"*
    ylimit = *something matplotlib reads as "use default"*
    linwidth = *something matplotlib reads as "use default"*

我创建了这个 class 的实例,但我只想指定 xlimit

inst = myclass()
inst.xlimit = [0,1]

并且我保持 ylimit 不变,所以 matplotlib 将其视为默认值。

然后我有一个功能

def plot_func(x,y,fig,inst):

    ax = fig.gca()
    ax.set_xlim(inst.xlimit)
    ax.set_ylim(inst.ylimit)
    ax.plot(x,y,linewidth=inst.linwidth)

    return fig

我可以调用并传递我的 class 实例。到目前为止,这对我来说很好,但我必须在 my_class().

中为所有绘图参数设置值

有没有一种方法可以将 my_class() 中的这些值设置为某些值,这样如果我决定我只想要 matplotlib 的默认计算,例如限制、刻度、标签等。我仍然可以通过这些 'variables' 到我的函数 plot_func() ,它们将全部设置在那里,我可以自定义我想要的,并将其他所有内容保留为默认值?

为了避免这些答案,我知道 matplotlib 的 rc 设置,这不是我要找的。

由于 matplotlib 中的几乎所有内容都由 kwargs 设置,您可以将所有可能的可选设置定义为 None,除非您要手动设置它们。

然后,当你调用 ax.plotax.set_xlim 时,你可以传入你的可选设置,所以如果函数接收到空值,你将获得默认设置,否则你将获得你手动定义的选项。

class my_class(object):
    xlimit = (None, None)
    ylimit = (None, None)
    linewidth = None
    color = None


def plot_func(x,y,fig,inst):

    ax = fig.gca()
    ax.plot(x, y, linewidth=inst.linewidth, color=inst.color)
    ax.set_xlim(inst.xlimit)
    ax.set_ylim(inst.ylimit)

    return fig

然后,如果我们使用默认设置调用它,我们将得到:

x = range(5)
y = range(5)

fig, ax = plt.subplots(1)
inst1 = my_class()
plot_func(x, y, fig, inst1)

fig.savefig('default_options.png')

否则,我们可以更改任何我们喜欢的设置:

ax.cla()

inst2 = my_class()
inst2.xlimit = [-2, 8]
inst2.linewidth = 5
inst2.color = 'r'

plot_func(x, y, fig, inst2)

fig.savefig('custom_options.png')

这个问题的关键是能够使用 None 作为默认值。您可以创建自己的 class,但对于更简单的事情,例如仅设置轴限制,您可以简单地执行类似下面的代码,无需创建和实例化特殊的 class。

    def plot_func(x,y,xlimit=[None, None],ylimit =[None, None]):

    ax = fig.gca()
    ax.plot(x, y)
    ax.set_xlim(xlimit)
    ax.set_ylim(ylimit)

    return fig

你可以用 plot_func(x,y) 当您只想绘图而不设置限制时 要么 plot_func(x,y,xlimit=[0,10]) 假设您想将 x 范围限制在 0 到 10 之间或其他任意范围