情节:使用字典分配颜色不起作用,悬停信息不正确

我已经在破折号上创建了直方图,如果我从下拉菜单中选择项目名称,直方图会根据项目的阶段而变化,现在我想为项目的每个阶段分配颜色,否则它将随机分配颜色。我的第二个问题是直方图的悬停文本。我的输出如下:

http://img1.mukewang.com/6180d232000184b913120395.jpg

所以在这个输出中,如果我从下拉菜单中选择了 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']

        }

我的输出将是:

http://img3.mukewang.com/6180d23f0001446a13570352.jpg

这几乎是我想要的输出,但是悬停文本仍然是错误的并且颜色是随机分配的,例如,我想使用字典将绿色分配给阶段 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)

谢谢。


慕容森
浏览 140回答 1
1回答

qq_遁去的一_1

仍然不太确定你在尝试什么,但这是发生了什么:如果你看一下df2['prjPhase']你会看到>>> df2['prjPhase']0    phase11    phase22    phase13    phase34    phase2Name: 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 的图形工厂甘特图。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python