Словарь цветов
Предположим, у вас есть color_dict
. Plotly принимает массив цветов с той же длиной, что и векторы меток и значений. Итак, вы должны построить этот массив самостоятельно, например, так:
import numpy as np
crit = np.array([1, 10, 2, 6, 1, 2, 2, 3, 1, 4, 6, 6, 9, 10, 5, 8, 3, 8,
5, 4, 9, 2, 8, 7, 1, 1, 7, 3, 9, 9, 6, 6, 8, 9, 6, 7, 5,
9, 8, 4, 4, 5, 6, 2, 9, 9, 4, 6, 9, 9])
color_dict = {'1':'#e6f2ff', '2':'#99ccff', '3':'#ccccff',
'4':'#cc99ff', '5':'#ff99ff', '6':'#ff6699',
'7':'#ff9966', '8':'#ff6600', '9':'#ff5050',
'10':'#ff0000'}
colors = np.array([''] * len(crit), dtype = object)
for i in np.unique(crit):
colors[np.where(crit == i)] = color_dict[str(i)]
Теперь для построения графика просто используйте "marker" : {'colors': colors}
для цветов.
Это даст вам сюжет с правильными цветами.
Бонусный вопрос
Круговые диаграммы по умолчанию сортируются по значениям, однако вместо них можно сортировать по меткам, используя "sort":False
.
К сожалению, это не сработает с тем, как вы строите диаграмму, поскольку будет принимать порядок, в котором поступают данные: то есть 1, 10, 2, 6 и т. Д., Что не то, что вам нужно.
Лучше дать Plotly уже агрегированные цифры по значению, например:
labels = np.unique(crit) #or simply = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
values = np.bincount(crit)[1:] #[5, 5, 3, 5, 4, 8, 3, 5, 10, 2]
Теперь нет необходимости помещать цвета в какой-либо словарь, поскольку они уже имеют ту же форму, что и ваши данные.
fig = {
"data": [
{
"values": values,
"labels": labels,
"domain": {"x": [0, .48]},
"name": "Criticality",
"sort": False,
"marker": {'colors': ['#e6f2ff', '#99ccff', '#ccccff',
'#cc99ff', '#ff99ff', '#ff6699',
'#ff9966', '#ff6600', '#ff5050',
'#ff0000']},
"textinfo":"percent+label",
"textfont": {'color': '#FFFFFF', 'size': 15},
"hole": .4,
"type": "pie"
} ],
"layout": {
"title":"Criticalities",
"annotations": [
{
"font": {
"size": 25,
"color": '#5A5A5A'
},
"showarrow": False,
"text": "2018",
"x": 0.20,
"y": 0.5
}
]
}
}
py.iplot(fig)
Это дает следующий результат, который, я полагаю, является тем, что вы хотите: