Как я мог получить другой цвет круговой диаграммы - PullRequest
0 голосов
/ 02 сентября 2018

Как я могу получить другой цвет круговой диаграммы? У меня есть набор данных около 20 категорий, и это может быть еще больше. Когда я создаю круговую диаграмму, некоторые клины имеют один и тот же цвет, поэтому мне интересно, есть ли способ, при котором все цвета могут быть разными в клине моих круговых диаграмм? Спасибо!

1 Ответ

0 голосов
/ 02 сентября 2018

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

enter image description here

Для большего количества цветов можно, конечно, также использовать различные цветовые карты , но они обычно дают довольно похожие цвета рядом друг с другом. Например. для круговой диаграммы с 30 различными цветами мы можем использовать цветовую карту nipy_spectral или CMRmap.

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

Так что можно добавить другое измерение. Выбор некоторых цветов из любой цветовой карты и создание разных уровней яркости для каждого из них. Это в основном показано в этот ответ Здесь, чтобы получить, например, 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...