Возник вопрос о том, как раскрасить кольца сюжетно-полярной карты. Я хотел бы добавить разные цвета фона в зависимости от категорий.
Рассмотрим рейтинг навыков, в котором хотелось бы выделить вид навыка в общем обзоре:
import plotly.graph_objects as go
categories = [
"[lang] English", "[lang] Spanish", "[lang] German",
"[dev] JS", "[dev] Python", "[dev] Go", "[dev] C#",
"[skill] leadership", "[skill] creativity"
]
# remove prefix, this should be reflected by the background color
categories = [c.split("] ")[1] for c in categories]
ratings = {
"Alice": [4,5,0,3,4,5,2,3,5],
"Bob": [3,1,4,2,3,1,1,3,2],
}
fig = go.Figure()
for name in ratings.keys():
fig.add_trace(go.Scatterpolar(
r=ratings[name] + [ratings[name][0]],
theta=categories + [categories[0]],
name=name,
))
fig.show()
Можно ли выделить тип категорий, изменив цвет фона, чтобы он выглядел как этот (поддельный) пример?
Я поискал в сети разные варианты, но нашел только другой вопрос, на который указал.
Это можно сделать, добавив к текущей фигуре трассу go.Barpolar , где категории располагаются вдоль угловой оси так же, как и для трассы Scatterpolar, и где на радиальной оси величина одинакова для все столбцы, то есть максимальное значение ratings
(чтобы цветные области равномерно охватывали полярную диаграмму). Укажите цвет каждого фрагмента категории, используя свойство marker_color.
categories = [
"[lang] English", "[lang] Spanish", "[lang] German",
"[dev] JS", "[dev] Python", "[dev] Go", "[dev] C#",
"[skill] leadership", "[skill] creativity"
]
kinds = [re.search('^\[(.+)\]', c).group(1) for c in categories]
categories = [c.split("] ")[1] for c in categories]
ratings = {
"Alice": [4,5,0,3,4,5,2,3,5],
"Bob": [3,1,4,2,3,1,1,3,2],
}
fig = go.Figure()
for name in ratings.keys():
fig.add_trace(go.Scatterpolar(
r=ratings[name] + [ratings[name][0]],
theta=categories + [categories[0]],
name=name,
))
# Pick a color palette and give a color to each kind of category
colors = px.colors.qualitative.D3
colormap = { kind: colors[i] for i, kind in enumerate(set(kinds)) }
fig.add_trace(go.Barpolar(
theta=categories,
r=len(categories)*[max(x for v in ratings.values() for x in v)],
marker_color=list(map(lambda kind: colormap[kind], kinds)),
opacity=0.6,
name='Kind'
))
fig.update_polars(bargap=0)
fig.show()