【问题标题】:Get colors from matplotlib style [duplicate]从matplotlib样式中获取颜色[重复]
【发布时间】:2020-02-06 18:23:56
【问题描述】:

我想要达到的目标:

我想在一个图形上创建多个饼图。它们都有一些类别,但有时有不同的类别。显然,我希望所有相同的类别都具有相同的颜色。

这就是为什么我创建了一个将类别(= 标签)链接到颜色的字典。有了它,我可以指定饼图的颜色。但我想使用 ggplot 颜色(matplotlib.style.style.use('ggplot') 附带)。我怎样才能让这些颜色输入我的字典?

# set colors for labels
color_dict = {}
for i in range(0, len(data_categories)):
    color_dict[data_categories[i]] = ???

# apply colors
ind_label = 0
for pie_wedge in pie[0]:
    leg = ax[ind].get_legend()
    pie_wedge.set_facecolor(color_dict[labels_0[ind_label]])          
    leg.legendHandles[ind_label].set_color_(color_dict[labels_0[ind_label]])
    ind_label += 1

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    简答

    要访问ggplot 样式中使用的颜色,您可以执行以下操作

    In [37]: import matplotlib.pyplot as plt                                                  
    
    In [38]: plt.style.use('ggplot')                                                          
    
    In [39]: colors = plt.rcParams['axes.prop_cycle'].by_key()['color']                       
    
    In [40]: print('\n'.join(color for color in colors))                                      
    #E24A33
    #348ABD
    #988ED5
    #777777
    #FBC15E
    #8EBA42
    #FFB5B8
    

    在上面的示例中,颜色作为 RGB 字符串包含在列表 colors 中。

    记得在访问颜色列表之前调用plt.style.use(...),否则你会找到标准颜色。


    更详细的解释

    上面的答案是为 Matplotlib 的现代版本量身定制的,其中绘图颜色和可能的其他绘图属性,如线宽和破折号(参见 this answer of mine)存储在 rcParams 字典中,键为 'axes.prop_cycle' 和包含在一种新的对象中,cyclercycler 的另一种解释包含在我上面引用的答案中)。

    要获取颜色列表,我们必须从rcParams 中获取cycler,然后使用它的.by_key() 方法

    Signature: c.by_key()
    Docstring: Values by key
    
    This returns the transposed values of the cycler.  Iterating
    over a `Cycler` yields dicts with a single value for each key,
    this method returns a `dict` of `list` which are the values
    for the given key.
    
    The returned value can be used to create an equivalent `Cycler`
    using only `+`.
    
    Returns
    -------
    transpose : dict
        dict of lists of the values for each key.
    

    拥有一个值字典,最后我们使用键 'color' 进行索引。


    附录

    use('a_style') 访问其颜色并不是绝对必要的,颜色(可能)在存储在字典 matplotlib.style.library 中的 matplotlib.RcParams 对象中定义。例如,让我们打印不同样式中定义的所有颜色序列

    In [23]: for style in plt.style.library: 
        ...:     the_rc = plt.style.library[style] 
        ...:     if 'axes.prop_cycle' in the_rc: 
        ...:         colors = the_rc['axes.prop_cycle'].by_key()['color'] 
        ...:         print('%25s: %s'%(style, ', '.join(color for color in colors))) 
        ...:     else: 
        ...:         print('%25s: this style does not modify colors'%style)                                                                          
              dark_background: #8dd3c7, #feffb3, #bfbbd9, #fa8174, #81b1d2, #fdb462, #b3de69, #bc82bd, #ccebc4, #ffed6f
                       ggplot: #E24A33, #348ABD, #988ED5, #777777, #FBC15E, #8EBA42, #FFB5B8
               seaborn-poster: this style does not modify colors
                 seaborn-talk: this style does not modify colors
               seaborn-bright: #003FFF, #03ED3A, #E8000B, #8A2BE2, #FFC400, #00D7FF
             seaborn-notebook: this style does not modify colors
             seaborn-darkgrid: this style does not modify colors
                          bmh: #348ABD, #A60628, #7A68A6, #467821, #D55E00, #CC79A7, #56B4E9, #009E73, #F0E442, #0072B2
                         fast: this style does not modify colors
                      seaborn: #4C72B0, #55A868, #C44E52, #8172B2, #CCB974, #64B5CD
                seaborn-white: this style does not modify colors
                _classic_test: b, g, r, c, m, y, k
                 seaborn-deep: #4C72B0, #55A868, #C44E52, #8172B2, #CCB974, #64B5CD
                seaborn-paper: this style does not modify colors
                    grayscale: 0.00, 0.40, 0.60, 0.70
         seaborn-dark-palette: #001C7F, #017517, #8C0900, #7600A1, #B8860B, #006374
           seaborn-colorblind: #0072B2, #009E73, #D55E00, #CC79A7, #F0E442, #56B4E9
         tableau-colorblind10: #006BA4, #FF800E, #ABABAB, #595959, #5F9ED1, #C85200, #898989, #A2C8EC, #FFBC79, #CFCFCF
                 seaborn-dark: this style does not modify colors
                      classic: b, g, r, c, m, y, k
               seaborn-pastel: #92C6FF, #97F0AA, #FF9F9A, #D0BBFF, #FFFEA3, #B0E0E6
                seaborn-ticks: this style does not modify colors
              Solarize_Light2: #268BD2, #2AA198, #859900, #B58900, #CB4B16, #DC322F, #D33682, #6C71C4
            seaborn-whitegrid: this style does not modify colors
                seaborn-muted: #4878CF, #6ACC65, #D65F5F, #B47CC7, #C4AD66, #77BEDB
              fivethirtyeight: #008fd5, #fc4f30, #e5ae38, #6d904f, #8b8b8b, #810f7c
    

    PS——据我所知

    • 不修改颜色的seaborn-xxx 样式将用作样式序列中的最后一步,例如plt.style.use(['seaborn', 'seaborn-poster'])plt.style.use(['seaborn', 'seaborn-muted', 'seaborn-poster'])
    • 唯一不修改颜色的其他样式fast 就是调整渲染参数以实现更快的渲染。

    【讨论】:

    • 如果您不需要实际的 RGB 代码,这是一个很好的速记:plt.plot(x, color="C0") 或 C1 或 C2 等选择样式的颜色!这是从stackoverflow.com/a/57028405/5522601 学到的
    • @smcs 很棒的速记,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2018-05-31
    相关资源
    最近更新 更多