Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获得不同的饼图颜色_Python_Matplotlib - Fatal编程技术网

Python 如何获得不同的饼图颜色

Python 如何获得不同的饼图颜色,python,matplotlib,Python,Matplotlib,如何获得不同的饼图颜色?我有一个大约20个类别的数据集,它可能更大。当我创建一个饼图时,一些楔形块具有相同的颜色,所以我想知道有没有一种方法可以使我的饼图楔形块中的所有颜色都不同? 谢谢 20种颜色正是通过matplotlib中的分类/定性颜色贴图所能达到的极限。目前,matplotlib提供了tab20,tab20b,tab20c颜色映射 import matplotlib.pyplot as plt import numpy as np data = np.random.randint(5

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

20种颜色正是通过matplotlib中的分类/定性颜色贴图所能达到的极限。目前,matplotlib提供了
tab20
tab20b
tab20c
颜色映射

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

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

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

因此,我们可以添加另一个维度。从任何颜色贴图中选择一些颜色,并为每个颜色创建不同的亮度级别。这基本上如图所示。在这里,为了获得例如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()

您的问题是否有答案?对于未知n,cmap选项可能是最好的方法,尽管颜色可能会变得非常相似,但高n值。回答了您的问题吗?请查看
color=[colorlist]
选项。