【问题标题】:How to use correct cmap colors in nested pie chart in matplotlib如何在 matplotlib 的嵌套饼图中使用正确的 cmap 颜色
【发布时间】:2019-08-30 05:28:28
【问题描述】:

如何使用正确的 np.array 的 cmap 内部颜色对应于 matplotlib 中嵌套饼图中外部颜色的阴影?

我尝试使用不同的 cmap 数组,但我不明白这些数组是如何转换为 cmap 颜色的。

import numpy as np
import matplotlib.pyplot as plt

y =np.array([17, 16, 10, 8 ,6, 5, 5, 4, 3,  17 ,2 ,1, 1, 3, 2 ])
x = np.array([74 ,21 ,5])

fig, ax = plt.subplots()

size = 0.3

cmap = plt.get_cmap("tab20c")

outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))

ax.pie(x, radius=1, colors=outer_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

ax.pie(y, radius=1-size, colors=inner_colors,
       wedgeprops=dict(width=size, edgecolor='w'))

ax.set(aspect="equal", title='Pie plot with `ax.pie`')
plt.show()

我希望内部颜色是外部颜色的阴影(绿色、蓝色和橙色),但我不知道如何相应地更改它们。

谢谢!

【问题讨论】:

    标签: python matplotlib pie-chart


    【解决方案1】:

    tab20c 颜色图每个色调有 4 种色调。因此,不可能将其用于 9 个子类别。

    A.扩展每个色调的色调数量

    matplotlib generic colormap from tab10 中提取categorical_cmap 可以得到每种色调的更多色调。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.colors
    
    def categorical_cmap(nc, nsc, cmap="tab10", continuous=False):
        if nc > plt.get_cmap(cmap).N:
            raise ValueError("Too many categories for colormap.")
        if continuous:
            ccolors = plt.get_cmap(cmap)(np.linspace(0,1,nc))
        else:
            ccolors = plt.get_cmap(cmap)(np.arange(nc, dtype=int))
        cols = np.zeros((nc*nsc, 3))
        for i, c in enumerate(ccolors):
            chsv = matplotlib.colors.rgb_to_hsv(c[:3])
            arhsv = np.tile(chsv,nsc).reshape(nsc,3)
            arhsv[:,1] = np.linspace(chsv[1],0.25,nsc)
            arhsv[:,2] = np.linspace(chsv[2],1,nsc)
            rgb = matplotlib.colors.hsv_to_rgb(arhsv)
            cols[i*nsc:(i+1)*nsc,:] = rgb       
        cmap = matplotlib.colors.ListedColormap(cols)
        return cmap
    
    y =np.array([17, 16, 10, 8 ,6, 5, 5, 4, 3,  17 ,2 ,1, 1, 3, 2 ])
    x = np.array([74 ,21 ,5])
    
    fig, ax = plt.subplots()
    
    size = 0.3
    
    cmap = categorical_cmap(3, 10)
    
    outer_colors = cmap(np.array([0, 10, 20]))
    ar = np.concatenate((np.arange(1,10), [13,15,17,19], [25,30]))
    inner_colors = cmap(ar)
    
    ax.pie(x, radius=1, colors=outer_colors,
           wedgeprops=dict(width=size, edgecolor='w'))
    
    ax.pie(y, radius=1-size, colors=inner_colors,
           wedgeprops=dict(width=size, edgecolor='w'))
    
    ax.set(aspect="equal", title='Pie plot with `ax.pie`')
    plt.show()
    

    B.使用三种不同的颜色图

    或者,可以使用三种不同的连续颜色图,并采用其中一些颜色。

    import numpy as np
    import matplotlib.pyplot as plt
    
    y =np.array([17, 16, 10, 8 ,6, 5, 5, 4, 3, 17 ,2 ,1, 1, 3, 2 ])
    x = np.array([74 ,21 ,5])
    
    fig, ax = plt.subplots()
    
    size = 0.3
    
    cmap1 = plt.cm.Reds
    cmap2 = plt.cm.Purples
    cmap3 = plt.cm.Greens
    
    outer_colors = [cmap1(.8), cmap2(.8), cmap3(.8)]
    inner_colors = [*cmap1(np.linspace(.6, .1, 9)),
                    *cmap2(np.linspace(.6, .2, 4)),
                    *cmap3(np.linspace(.6, .2, 2))]
    
    ax.pie(x, radius=1, colors=outer_colors,
           wedgeprops=dict(width=size, edgecolor='w'))
    
    ax.pie(y, radius=1-size, colors=inner_colors,
           wedgeprops=dict(width=size, edgecolor='w'))
    
    ax.set(aspect="equal", title='Pie plot with `ax.pie`')
    plt.show()
    

    【讨论】:

    • 请问你是怎么知道第一个代码中的数组sn-ps outer_colors = cmap(np.array([0, 10, 20])) ar = np.concatenate((np.arange(1,10), [13,15,17,19], [25,30]))
    • 真正“知道”的并不多。它只是手动取出颜色索引。因为每个色相有 10 种颜色,前 10 个索引(0 到 9)是第一个色相的索引,接下来的(10 到 19)是第二个色相的索引,以此类推。
    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多