情节:使用字典分配颜色不起作用且悬停信息不正确
Plotly: using dictionary to assign colors is not working & hover info not correct
我已经在破折号上创建了直方图,如果我从下拉菜单中选择项目名称,直方图会根据项目的阶段而变化,现在我想为项目的每个阶段分配颜色,否则它会分配颜色随机的。我的第二个问题是直方图的悬停文本。我的输出如下:
所以在这个输出中,如果我从下拉菜单中选择 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']
}
我的输出是:
这几乎是我想要的输出,但悬停文本仍然是错误的并且随机分配颜色,例如,我想将绿色分配给 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)
谢谢。
仍然不太确定你在尝试什么,但这是正在发生的事情:
如果你看一下 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。
我已经在破折号上创建了直方图,如果我从下拉菜单中选择项目名称,直方图会根据项目的阶段而变化,现在我想为项目的每个阶段分配颜色,否则它会分配颜色随机的。我的第二个问题是直方图的悬停文本。我的输出如下:
color_dict = {'phase1': '#9400D3', 'phase2': '#32CD32', 'phase3': '#FF8000','phase4': '#4682B4'}
marker': {
'color': color_dict
}
但如果我使用颜色作为列表,它可以工作,但它会将颜色设置为随机标签:
marker': {
'color': ['#9400D3','#32CD32', '#FF8000','#4682B4']
}
我的输出是:
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)
谢谢。
仍然不太确定你在尝试什么,但这是正在发生的事情:
如果你看一下 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。