python - 如何在matplotlib的嵌套饼图中使用正确的cmap颜色

标签 python matplotlib pie-chart

如何使用 cmap 的正确 np.array 使内部颜色对应于 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()

enter image description here

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

谢谢!

最佳答案

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

A. 扩展每个色调的阴影数

服用 categorical_cmap来自 matplotlib generic colormap from tab10每个色调获得更多色调。

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()

enter image description here

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()

enter image description here

关于python - 如何在matplotlib的嵌套饼图中使用正确的cmap颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57720935/

相关文章:

python读取并验证输入url

python - Pycharm:如何为外部对象类型设置自定义字符串函数(即Type Renderer)?

python - 将 numpy 二维数组划分为更精细的分辨率

python - QScrollWidget 中的 PyQt4 + matplotlib

html - 重叠 div 上的悬停事件不起作用

python - 返回字典中元组键给定元素的最大值

python - 在seaborn中旋转标签文本

python /Matplotlib : How to plot in a subplot with ticks but no tick labels?

python - 使用 matplotlib 创建一个饼图

r - 在 R 中排列 4 个 plotly 饼图