Plotly: использование словаря для назначения цветов не работает и информация при наведении неверна - PullRequest
0 голосов
/ 07 февраля 2019

Я создал гистограмму на приборной панели, если я выбираю имена проектов из выпадающего меню, гистограмма изменяется в зависимости от фаз проектов, теперь я хотел бы назначать цвета для каждой фазы проектов, в противном случае он будет назначать цвета случайным образом.Второй вопрос - текст гистограммы.Мой вывод выглядит следующим образом: enter image description here Так что в этом выводе, если я выбрал prj-1, prj2 из выпадающего меню.Я вижу 3 этапа, которые принадлежат выбранным проектам.Но текст для наведения на фазу 3 отображается как «фаза1».И цвета для трех столбцов одинаковы, даже когда я создал словарь для цветов, которые я пробовал со следующими строками, но в результате я вижу только один цвет для всех столбцов в гистограмме.:

color_dict = {'phase1': '#9400D3', 'phase2': '#32CD32', 'phase3': '#FF8000','phase4': '#4682B4'}
marker': {
            'color': color_dict
        }

но если я использую цвета в качестве списка, он работает, но он устанавливает цвета на случайные метки:

    marker': {
            'color': ['#9400D3','#32CD32', '#FF8000','#4682B4']
        }

И мой вывод будет: enter image description here Это почти мой желаемый результат, но все же текст при наведении неверен, а цвета назначены случайным образом, я хотел бы, например, назначить зеленый для фазы1, фиолетовый для фазы2 и т. Д., Используя словарь, как я привел пример выше.вот полный код:

import dash
from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
def gantt_fig(df,val):
    if isinstance(val, str):
        df = df.loc[df['prjID']==val]
    else:
        df = df[df['prjID'].isin(val)]
    return df
df = pd.DataFrame({'prjID': ['prj-1', 'prj-1','prj-2', 'prj-2', 'prj-2','prj-3', 'prj-3', 'prj-4'],
               'prjPhase': ['phase1', 'phase2','phase1', 'phase3', 'phase2', 'phase2','phase1', 'phase4']})
options = df['prjID'].unique()
activities = df['prjPhase'].unique()
app = dash.Dash()
app.layout = html.Div([
    dcc.Dropdown(id='my-dropdown',options=[{'label': name, 'value': name} for name in options],
        value=options[0], multi=True),
    dcc.Graph(id='my-graph')])

@app.callback(Output('my-graph', 'figure'), [Input('my-dropdown', 'value')])
def update_graph(dropdownproject):
    fig = gantt_fig(df, dropdownproject)
    df2= fig
    color_dict = {'phase1': '#9400D3', 'phase2': '#32CD32', 'phase3': '#FF8000','phase4': '#4682B4'}
    figure = {
        'data': [
        {
            'x': df2['prjPhase'],
            'text': df2['prjPhase'],
            'type': 'histogram',
            'marker': {
                'color': color_dict
            }}]}
    return figure
if __name__ == '__main__':
    app.run_server(debug=True)

Спасибо.

1 Ответ

0 голосов
/ 09 февраля 2019

Все еще не совсем уверен в том, что вы пытаетесь, но вот что происходит:

Если вы посмотрите на df2['prjPhase'], вы увидите

>>> df2['prjPhase']
0    phase1
1    phase2
2    phase1
3    phase3
4    phase2
Name: prjPhase, dtype: object

, поэтому при использованиигистограмма, 'x': df2['prjPhase'] будет подсчитывать вхождений каждого уникального значения в этом ряду.Поскольку существует 3 различных значения, ось X будет иметь 3 ячейки, и, выполнив 'text': df2['prjPhase'], вы передадите 5 значений этим ячейкам, следовательно, неправильные имена.

'text': df2['prjPhase'].unique() будет более подходящим (все жеЯ бы проверил порядок, который это дает) и что касается цвета, 'color': [color_dict[x] for x in df2['prjPhase'].unique()] будет гарантировать, что правильный цвет используется в каждой трассе (если вы только поместите список, цвет будет неправильным, если есть вхождение phase4 безphase3 один, например).

Если вы работаете с диаграммами Ганта, я бы также взглянул на фабричные диаграммы Ганта на графике .

...