Python & Plotly: пользовательские цвета для круговой диаграммы через словарь - PullRequest
0 голосов
/ 17 мая 2018

Я создаю механизм создания отчетов и изо всех сил пытаюсь получить работу по настройке, как я хочу.У меня есть данные, которые содержат критичность от 1 до 10, и я хотел бы, чтобы на круговой шкале рейтинг 10 всегда получал красный цвет, рейтинг 9 - оранжевый и т. Д.

Мой текущий код следующий:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import plotly.plotly as py
import plotly.graph_objs as go
import plotly.figure_factory as FF

import numpy as np
import pandas as pd

crit = [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]

fig = {
  "data": [
    {
      "values": crit,
      "labels": crit,
      "domain": {"x": [0, .48]},
      "name": "Criticality",
      "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, filename='pie-custom-colors')

, но это приводит к следующему рисунку:

graph

Есть ли способ сопоставить эти цвета на основевроде:

colors = { 
'10':'#ff0000'
'9':'#ff5050'
etc.. }

Бонусный вопрос: есть ли способ отсортировать иконки также на правой стороне от 10-> 1

1 Ответ

0 голосов
/ 17 мая 2018

Словарь цветов

Предположим, у вас есть 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)

Это дает следующий результат, который, я полагаю, является тем, что вы хотите:

enter image description here

...