为每个数字

时间:2017-07-14 12:51:14

标签: python matplotlib plot

是否可以为我在脚本中创建的每个图形使用不同的matplotlib样式?

with plt.style.context("style.mpstyle"):
    ...

可用于在matplotlib中定义临时自定义样式。我在一个类中使用它,它应该处理我的所有样式:

class Plots():
    def __init__(self):
        if style == "a":
            self.use_style_a()
        else:
            self.use_style_b()

    def use_style_a():
        with plt.style.context("style_a.mpstyle"):
            self.fig = plt.figure()
            [...]

    def use_style_b():
        with plt.style.context("style_b.mpstyle"):
            self.fig = plt.figure()
            [...]

不幸的是,它并没有真正起作用。或者它只能工作50%......所以如果我在初始函数调用之外调用plt.legend(),它就不会应用外部样式文件中的样式。 那么有没有办法将数字样式应用于该数字实例,无论我从何处调用它?

解决方案

ImportanceOfBeingErnest给了我正确的提示,我现在以修改的方式使用它。不幸的是,mpl.style.context()方法在这种情况下不起作用 - 我不知道为什么。但我总是可以覆盖要使用的样式。可能不是mpl创作者有意使用,但它有效。这是我的代码:

import matplotlib.pyplot as plt

class Plot(object):
    def __init__(self, name):
        self.plot_style = name

        func = getattr(self, name)
        result = func()

    def A(self):
        plt.style.use("A.mpstyle")
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(1, 1, 1)

        # Some styles, labels, ...

    def B(self):
        plt.style.use("B.mpstyle")
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(1, 1, 1)

        # Some styles, labels, ...

    def __getattribute__(self, name):
        if name == "ax":
            plt.style.use("{}.mpstyle".format(self.plot_style))
            return object.__getattribute__(self, name)
        else:
            return object.__getattribute__(self, name)

plot_A = Plot("A")
plot_B = Plot("B")

plot_A.ax.plot([1,2,4],[4,2,3])
plot_B.ax.plot([1,2,4],[3,1,6])
plot_A.ax.legend()
plot_B.ax.legend()

# ...

1 个答案:

答案 0 :(得分:2)

它认为这一切都取决于你想如何使用这个类。如果要创建相同的绘图,但具有不同的样式,则选项如下:

import matplotlib.pyplot as plt

class Plots():
    def __init__(self, style):
        self.set_style(style)
        self.plot()

    def set_style(self, style):
        self.style = "style_{}.mpstyle".format(style)

    def plot(self):
        with plt.style.context(self.style):
            self.fig, self.ax = plt.subplots()
            self.ax.plot([1,2,4])
            self.ax.legend()
            plt.show()

p = Plots("a")
p2 = Plots("b")

我还可以想象你想使用不同的函数来进行实际的绘图并使用类来管理样式。

import matplotlib.pyplot as plt

class Plots():
    def __init__(self, style="a"):
        self.set_style(style)

    def set_style(self, style):
        self.style = style

    def plot(self, func, *args,**kwargs):
        with plt.style.context(self.style):
            return func(*args,**kwargs)

def myplottingfunction1():
    fig, ax = plt.subplots()
    ax.plot([1,2,4],[4,2,3], label="mylabel 1")
    ax.legend()

def myplottingfunction2(color="red"):
    fig, ax = plt.subplots()
    ax.scatter([1,2,4],[3,1,6], color=color,label="mylabel 2")
    ax.legend()


p = Plots("dark_background").plot(myplottingfunction1)
p2 = Plots("ggplot").plot(myplottingfunction2, color="blue")

plt.show()

第二个脚本的输出将是

enter image description here

当然,图例可以单独绘制,例如像

def myplottingfunction1():
    fig, ax = plt.subplots()
    ax.plot([1,2,4],[4,2,3], label="mylabel 1")
    return ax

def myplottingfunction2(color="red"):
    fig, ax = plt.subplots()
    ax.scatter([1,2,4],[3,1,6], color=color,label="mylabel 2")
    return ax

p = Plots("dark_background")
ax = p.plot(myplottingfunction1)
p2 = Plots("ggplot")
ax2 = p2.plot(myplottingfunction2, color="blue")

# do something else with ax or ax2

p.plot(ax.legend)
p2.plot(ax2.legend)

plt.show()