我该如何分享matplotlib风格?

时间:2016-03-07 18:30:14

标签: python matplotlib

可以在matplotlib中加载自定义绘图样式,例如:

>>> import matplotlib.pyplot as plt
>>> plt.style.use('ggplot')

而且我知道我可以创建自己的,http://matplotlib.org/users/style_sheets.html解释如何。

假设我创造了一种令人惊叹的matplotlib风格 - 我如何与其他人分享?有没有办法用pip / conda或其他合适的方法做到这一点?

文档包含“创建自定义样式并通过调用style.use使用样式表的路径或URL来使用它们”的建议。 - 所以我想我可以在一些公共git存储库上维护一个链接,如果他们放了那个URL,人们会得到最新的样式?

2 个答案:

答案 0 :(得分:6)

您可以在以下结构中组织代码:

|
└─── setup.py
└─── mplstyles
         style_01.mplstyle
         style_02.mplstyle

然后,在您的文件setup.py中写下如下内容:

# -*- coding: utf-8 -*-
import matplotlib as mpl
import glob
import os.path
import shutil
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-install', action='store_true', default=True)
parser.add_argument('-upgrade', action='store_true')
options = parser.parse_args()

#~ # ref  ->  matplotlib/style/core
BASE_LIBRARY_PATH = os.path.join(mpl.get_data_path(), 'stylelib')
STYLE_PATH = os.path.join(os.getcwd(),'mplstyles')
STYLE_EXTENSION = 'mplstyle'
style_files = glob.glob(os.path.join(STYLE_PATH,"*.%s"%(STYLE_EXTENSION)))

for _path_file in style_files:
    _, fname = os.path.split(_path_file)
    dest = os.path.join(BASE_LIBRARY_PATH, fname)
    if not os.path.isfile(dest) and options.install:
        shutil.copy(_path_file, dest)
        print("%s style installed"%(fname))
    elif options.upgrade:
        shutil.copy(_path_file, dest)
        print("%s style upgraded"%(fname))
    elif os.path.isfile(dest):
        print("%s style already exists (use -upgrade to upgrade)"%(fname))
    else:
        pass # ¿?

上面的代码从" mplstyles"复制每个.mplstyle(或样式表)文件。文件夹到Matplotlib安装目录。

"安装"样式

>> python setup.py -install

"升级"样式

>> python setup.py -upgrade

答案 1 :(得分:1)

我刚才有同样的问题。一个尚未解决的小资。我找到了一个解决方案,可以使用PyPi(在我的情况下goosempl,也在GitHub)分发样式。

我创建了一个Python模块,mplstyle - 文件是其中的一部分:

|-- setup.py
|-- package_name
|   |-- __init__.py
|   |-- styles
|   |   |-- example.mplstyle

现在的想法是:

  1. .mplstyle文件与模块打包在一起。
  2. 模块已安装。
  3. 在安装结束时,会运行一个小脚本,从新安装的软件包中提取.mplstyle文件,并将它们写入matplotlib config目录。
  4. 以下是必需品

    setup.py

    import atexit
    from setuptools                 import setup
    from setuptools.command.install import install
    
    def _post_install():
        import goosempl
        package_name.copy_style()
    
    class new_install(install):
        def __init__(self, *args, **kwargs):
            super(new_install, self).__init__(*args, **kwargs)
            atexit.register(_post_install)
    
    __version__ = '0.1.0'
    
    setup(
        name              = 'package_name',
        version           = __version__,
        ...
        install_requires  = ['matplotlib>=2.0.0'],
        packages          = ['package_name'],
        cmdclass          = {'install': new_install},
        package_data      = {'package_name/styles':[
            'package_name/styles/example.mplstyle',
        ]},
    )
    

    初始化的.py

    def copy_style():
    
      import os
      import matplotlib
    
      from pkg_resources import resource_string
    
      files = [
        'styles/example.mplstyle',
      ]
    
      for fname in files:
        path = os.path.join(matplotlib.get_configdir(),fname)
        text = resource_string(__name__,fname).decode()
        open(path,'w').write(text)
    

    供将来参考,请参阅以下相关问题/文档: