【问题标题】:How to find matplotlib style name?如何找到 matplotlib 样式名称?
【发布时间】:2021-05-19 18:49:30
【问题描述】:

是否可以知道当前matplotlib样式的名称?我知道我可以使用plt.style.available 获取所有可用样式的列表,但我想要的是获取当前正在使用的样式名称的可能性。我在 spyder,python 3.5 的 ipython 控制台中工作,但如果对此的答案取决于我的工作环境,我会感到惊讶:)

【问题讨论】:

    标签: python matplotlib plot


    【解决方案1】:

    查看the source of plt.style.use,我没有看到任何迹象表明使用新样式会存储正在使用的样式的名称。

    我考虑过手动检查当前的rcParams 与每种可用样式,如下所示:

    import matplotlib.pyplot as plt
    
    for style in plt.style.available:
        for key in plt.style.library[style]:
            if plt.rcParams[key] != plt.style.library[style][key]:
                break
        else:
            print('Current style is consistent with {}.'.format(style))
    

    但是没有可用的样式与我的默认样式匹配。然后我也打印了不匹配的原因:

    for style in plt.style.available:
        for key in plt.style.library[style]:
            val_now,val_style = plt.rcParams[key],plt.style.library[style][key]
            if val_now != val_style:
                print('Discarding style {}: {} vs {} for key {}'.format(style,val_now,val_style,key))
                break
        else:
            print('Current style is consistent with {}.'.format(style))
    

    部分输出:

    Discarding style seaborn-paper: 0.6 vs 0.4 for key xtick.minor.width
    Discarding style seaborn-whitegrid: w vs white for key figure.facecolor
    Discarding style seaborn-talk: 0.8 vs 1.3 for key grid.linewidth
    

    注意第二项:w 与 white。现在这是一个问题。命名颜色不容易通过不同名称或 RGBA 值等与相同颜色进行测试。

    然后我考虑使用matplotlib.colors.to_rgba()转换每种颜色,但是如果你想正确地做到这一点,你需要完全解析参数,包括这样的宝石:

    Discarding style grayscale: figure.facecolor,w vs figure.facecolor,0.75
    

    即使后一个值对应于白色,我们也需要先解析该值并找到隐藏在其中的颜色。

    在我看来,唯一安全的实现方式是让plt.style.use 将样式名称存储在某处。但是,如果手动更改 rcParams 中的任何内容会发生什么?那么就不会有当前加载的样式。这是对存储样式名称的反驳。每当更改参数时,都必须进行检查以使最后一个 plt.style.use 调用的样式名称无效。我不确定您的问题是否有明显的解决方案。

    【讨论】:

    • 新的“默认”样式有名字吗?是“快”还是“海运”?
    • @TrevorBoydSmith 我认为就像旧的默认设置一样,新的默认设置也没有命名样式。在我的系统上(在我认为不应该触及风格的 ipython 中运行)“fast”与我的默认值不兼容 path.simplify_threshold,而“seaborn”有很多不兼容之处,例如与键 xtick.major.pad。跨度>
    • 参数。我希望在发行版 Centos7 matplotlib 版本 1.2.0 上使用新样式和较旧的 matplotlib。旧的 matplotlib 甚至没有 matplotlib.style 。所以样式功能甚至不是一个选项。哦,好吧。
    • @TrevorBoydSmith 您可以随时使用您的plt.rcParams 并在启动时使用它更新旧版本的plt.rcParams(通过硬编码或从某个文件中读取)。不理想,而且可能有当时不存在的键(不知道),但它可以很容易地工作得很好。
    • 是的。这就是我正在做的事情。 <pseudocode>linewidth=1.5. color_cycle=[tableu_0,tableu_1,...], margins=0.05</>。这些是目前主要的。
    【解决方案2】:

    您还可以根据与当前匹配的参数数量对可用样式进行排序,如下所示:

    r = [ ( style,
        round(sum([1 for key in plt.style.library[style] if plt.rcParams[key] == plt.style.library[style][key]]) \
        /len(plt.style.library[style]),2)
      )
      for style in plt.style.available
    ]
    sorted(r,key=lambda x: x[1], reverse=True)
    

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多