python matplotlib后端在程序参数读取

时间:2017-01-17 23:34:00

标签: python matplotlib

我编写了一个程序,并希望为用户提供在图形环境下运行它的机会。

目前通过硬编码我可以通过在导入pyplot之前更改程序文件顶部的matplotlib导入来执行其中一项操作。

带图形环境

import matplotlib
matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt
... 

没有图形环境

import matplotlib
matplotlib.use("agg")
import matplotlib.pyplot as plt
...

剩下的代码看起来像这样:

...
import os, sys, argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--noX", action="store_true", dest="noX")
    params = parser.parse_args()

    data = [0,1,2,3,4,5]
    fig, ax = plt.subplots()
    ax.plot(data)
    if not params.noX:
        plt.show()
    plt.savefig("foo.png")

    sys.exit(0)

if __name__ == "__main__":
    main()

是否可以根据noX参数值更改后端?

3 个答案:

答案 0 :(得分:1)

您可以将后端设置为条件:

import matplotlib
if not params.noX:
    matplotlib.use("agg")
else:
    matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt

如果您只在main内绘图,请在此功能中移动导入:

import argparse


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--noX", action="store_true", dest="noX", default=False)
    params = parser.parse_args()

    import matplotlib
    if not params.noX:
        matplotlib.use("agg")
    else:
        matplotlib.use("Qt4Agg")
    import matplotlib.pyplot as plt

    data = [0,1,2,3,4,5]
    fig, ax = plt.subplots()
    ax.plot(data)
    if not params.noX:
        plt.show()
    plt.savefig("foo.png")

    sys.exit(0)

if __name__ == "__main__":
    main()

如果你想在任何地方进行绘图,可以使用特殊功能来解析 命令行参数并只调用一次。

import argparse


def _parse_cmd_args():
    """Parse command line args.
    """
    parser = argparse.ArgumentParser()
    parser.add_argument("--noX", action="store_true", dest="noX", default=False)
    params = parser.parse_args()
    return params


PARAMS = _parse_cmd_args()
# Want to prevent any further call to `_parse_cmd_args()`?
# Un-comment the following line:
# del _parse_cmd_args


import matplotlib
if not PARAMS.noX:
    matplotlib.use("agg")
else:
    matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt

def main():
    data = [0,1,2,3,4,5]
    fig, ax = plt.subplots()
    ax.plot(data)
    if not PARAMS.noX:
        plt.show()
    plt.savefig("foo.png")
    sys.exit(0)

if __name__ == "__main__":
    main()

答案 1 :(得分:0)

你尝试过吗?作为一般规则,您无法更改后端。因此,在知道import的价值之前,您必须推迟决定。请注意,您可以随时随地import。建议在文件开头{{1}},但这并不总是可行。

答案 2 :(得分:0)

好的,所以将迈克的想法与plt的全球导入相结合,我想出了类似的东西来做这个伎俩。很抱歉打扰你,它实际上比最初想象的要简单。

import os, sys, argparse

import matplotlib
matplotlib.use("agg") if "--noX" in sys.argv else matplotlib.use("Qt4Agg")
import matplotlib.pyplot as plt

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--noX", action="store_true", dest="noX", default=False)
    params = parser.parse_args()

    data = [0,1,2,3,4,5]
    fig, ax = plt.subplots()
    ax.plot(data)
    if not params.noX:
        plt.show()
    plt.savefig("foo.png")

    sys.exit(0)
if __name__ == "__main__":
    main()