Как изменить панель условных обозначений и цвета, чтобы отображать каждую строку в Dataframe по отдельности? (Соответствует index_col)

#python #django #charts #plotly #gantt-chart

#python #django #Диаграммы #наглядно #диаграмма Ганта

Вопрос:

Как я могу изменить панель условных обозначений и цвета, чтобы отображать каждую строку в Dataframe по отдельности? Моя текущая диаграмма выглядит следующим образом:

Это производственный график. Каждая строка в Dataframe - это задание.

Код приведен ниже:

 def chart(task_list, filename):
    fig = ff.create_gantt(task_list, colors='Rainbow', index_col='Resource', show_colorbar=True, group_tasks=True)
    # plot(fig, filename=filename)
    return plot(fig, filename=filename, include_plotlyjs=False, output_type='div')
    #print(fig)
  

Rainbow‘ — это цветовая шкала по умолчанию для построения графика. Однако, если я не ошибаюсь, она ограничена всего двумя цветами.

Я просто хочу, чтобы на диаграмме была легенда, похожая на эту (будь то точки или линии, только не градиентная полоса, подобная текущей Gantt):

Это из документации по диаграмме Плотли Ганта.

Код для этого следующий:

 df = [dict(Task="Job A", Start='2016-01-01', Finish='2016-01-02', Resource='Apple'),
      dict(Task="Job B", Start='2016-01-02', Finish='2016-01-04', Resource='Grape'),
      dict(Task="Job C", Start='2016-01-02', Finish='2016-01-03', Resource='Banana')]

colors = dict(Apple = 'rgb(220, 0, 0)',
              Grape = 'rgb(170, 14, 200)',
              Banana = (1, 0.9, 0.16))

fig = ff.create_gantt(df, colors=colors, index_col='Resource', show_colorbar=True)
py.iplot(fig, filename='gantt-dictioanry-colors', world_readable=True)
  

Однако, когда я использую код из документации, он имеет только ограниченное количество цветов, задаваемых dict colors. Я хочу, чтобы цвета могли генерироваться самостоятельно всякий раз, когда из Dataframe поступает новая строка.

TLDR; нужна ЦВЕТОВАЯ ШКАЛА, которая сможет вместить все большее количество строк в Dataframe и изменить градиентную полосу на линии / точки / что угодно, чтобы она служила ЛЕГЕНДАМИ для каждой строки Dataframe в соответствии с index_col.

Ответ №1:

Попробуйте это

Измените Resource значение на string перед передачей в def chart(task_list, filename) , чтобы оно plot.ly принималось Resource как дискретная категория вместо непрерывной меры.

 task_list.Resource = task_list.Resource.apply(str)

import random

all_the_colors = list((x,y,z) for x in range(256) for y in range(256) for z in range(256))

colors = [f"rgb({random.choice(all_the_colors)})" for x in df.Resource.unique()]

def chart(task_list, filename):
    fig = ff.create_gantt(task_list, colors=colors, index_col='Resource', show_colorbar=True, group_tasks=True)
    # plot(fig, filename=filename)
    return plot(fig, filename=filename, include_plotlyjs=False, output_type='div')
    #print(fig)
  

Комментарии:

1. Привет! Он возвращает ошибку, аналогичную той, с которой я сталкивался раньше: Ошибка. Количество цветов в «colors» должно быть не меньше количества уникальных значений индекса в столбце вашей группы.