python - 我怎样才能得到不同的饼图颜色

标签 python matplotlib

如何获得不同的饼图颜色?我有一个大约 20 个类别的数据集,它可能会更大。当我创建饼图时,某些楔形物具有相同的颜色,所以我想知道是否有一种方法可以使饼图楔形物中的所有颜色都不同? 谢谢!

最佳答案

20 种颜色正是通过 matplotlib 中的分类/定性颜色图可以实现的限制。目前 matplotlib 提供 tab20tab20btab20c 颜色图。

import matplotlib.pyplot as plt
import numpy as np

data = np.random.randint(50,200, size=20)

fig = plt.figure()

with plt.style.context({"axes.prop_cycle" : plt.cycler("color", plt.cm.tab20.colors)}):
    ax = fig.add_subplot(121, aspect="equal")
    ax.pie(data)

with plt.style.context({"axes.prop_cycle" : plt.cycler("color", plt.cm.tab20c.colors)}):
    ax2 = fig.add_subplot(122, aspect="equal")
    ax2.pie(data)

plt.show()

enter image description here

对于更多颜色,当然也可以使用 different colormaps ,但这些通常会导致彼此相邻的颜色非常相似。例如。对于具有 30 种不同颜色的饼图,我们可以使用 nipy_spectralCMRmap 颜色图。

import matplotlib.pyplot as plt
import numpy as np

data = np.random.randint(50,200, size=30)

fig = plt.figure()

cc = plt.cycler("color", plt.cm.nipy_spectral(np.linspace(0,.9,len(data))))
with plt.style.context({"axes.prop_cycle" : cc}):
    ax = fig.add_subplot(121, aspect="equal")
    ax.pie(data)

cc = plt.cycler("color", plt.cm.CMRmap(np.linspace(0,0.9,len(data))))
with plt.style.context({"axes.prop_cycle" : cc}):
    ax2 = fig.add_subplot(122, aspect="equal")
    ax2.pie(data)

plt.show()

enter image description here

所以我们可以添加另一个维度。从任何颜色图中选择一些颜色并为每种颜色创建不同的亮度级别。这基本上显示在this answer中。 。在这里,为了得到例如30 种不同的颜色,我们可以选择 6 种颜色,每 5 个亮度级别。

import matplotlib.pyplot as plt
import numpy as np
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

data = np.random.randint(50,200, size=30)

fig = plt.figure()

cc = plt.cycler("color", categorical_cmap(6, 5, cmap="tab10").colors)
with plt.style.context({"axes.prop_cycle" : cc}):
    ax = fig.add_subplot(121, aspect="equal")
    ax.pie(data)

cc = plt.cycler("color", 
                categorical_cmap(6, 5, cmap="gist_rainbow", continuous=True).colors)
with plt.style.context({"axes.prop_cycle" : cc}):
    ax2 = fig.add_subplot(122, aspect="equal")
    ax2.pie(data)

plt.show()

enter image description here

关于python - 我怎样才能得到不同的饼图颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52134364/

相关文章:

python - Pymongo - 拖尾 oplog

python - MysqlPython : Not all parameters were used in MySQL statement

Python绘制极坐标方程

python - 将灰度图像转换回矢量

python - 导入 CV2 时收到来自 lingnutls/'Hogweed' 的错误

python - 如何在 mplot3d 中缩放轴

python - 使用 SciPy 数值求解 ODE

python - Python中球体投影图像的高程失真

python - 用 pandas 绘制水平持续时间

python - 如何在 python 中将点更改为轴上的逗号