密谋:使用字典分配颜色无效,并且悬停信息不正确

时间:2019-02-07 20:56:40

标签: python dictionary histogram plotly plotly-dash

我已经在破折号上创建了直方图,如果我从下拉菜单中选择项目名称,则直方图会根据projectcs的阶段而变化,现在我想为项目的每个阶段分配颜色,否则它将随机分配颜色。我的第二个问题是直方图的悬停文字。我的输出如下: enter image description here 因此,在此输出中,如果我从下拉菜单中选择了prj-1,prj2。我看到了属于选定项目的3个阶段。但是phase3的悬停文字显示为“ phase1”。即使我创建了以下行尝试的颜色字典,三个条形的颜色也是相同的,但是结果是直方图中所有条形只看到一种颜色。 :

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

但是如果我使用颜色作为列表,它可以工作,但是它将颜色设置为随机标签:

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

我的输出将是: enter image description here 这几乎是我想要的输出,但是仍然悬停文本是错误的,并且颜色是随机分配的,例如,我想使用字典作为我上面的示例,将绿色分配给phase1,将紫色分配给phase2等。 这是完整的代码:

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 :(得分:1)

仍然不确定您要尝试什么,但这是正在发生的事情:

如果您查看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的情况,则颜色将是错误的。

如果您正在使用甘特图,我还将看一看plotly的figure factory gantt charts