Plotly: How To Display Different Color Segments On A Line Chart For Specified Thresholds?
I have a multi-line graph that displays percent increase over time. I'd like to set a threshold in my code to have an upper and lower bound. If the line falls outside these bounds,
Solution 1:
I've put together a suggestion that should do exactly what you're asking for. The following figure is produced by the code sample below. The code uses a dictionary that contains the different upper and lower limits for your different PODs along with a possibility to set different colors for different pods:
lim = {'IAD': {'lower': 90,'upper': 350, 'color':'yellow'},
'SJCtest': {'lower': 10,'upper': 12, 'color':'green'}}
Plot
I was tempted to filter your dataframe first, and then add new traces to the figure based on that. But my solution actually goes through each datapoint for each trace, and colors the points based on the dictionary above. So no need for any datamunging. Take a look, run a few tests, and let me know how it works out for you.
Complete code
importpandasaspdimportplotly.expressaspximportplotly.graph_objectsasgodf=pd.DataFrame({'POD': {0:'IAD',
1:'IAD',
2:'IAD',
3:'IAD',
4:'IAD',
5:'IAD',
6:'IAD',
7:'IAD',
8:'IAD',
9:'IAD',
10:'IAD',
11:'IAD',
12:'IAD',
13:'IAD',
14:'IAD',
15:'IAD',
16:'IAD',
17:'IAD',
18:'IAD',
19:'SJCtest',
20:'SJCtest',
21:'SJCtest',
22:'SJCtest',
23:'SJCtest',
24:'SJCtest'},'Start': {0:'4/1/2019',
1:'5/1/2019',
2:'6/1/2019',
3:'7/1/2019',
4:'8/1/2019',
5:'9/1/2019',
6:'10/1/2019',
7:'11/1/2019',
8:'12/1/2019',
9:'1/1/2020',
10:'2/1/2020',
11:'3/1/2020',
12:'4/1/2020',
13:'5/1/2020',
14:'6/1/2020',
15:'7/1/2020',
16:'8/1/2020',
17:'9/1/2020',
18:'10/1/2020',
19:'4/1/2019',
20:'5/1/2019',
21:'6/1/2019',
22:'7/1/2019',
23:'8/1/2019',
24:'9/1/2019'},'End': {0:'5/1/2019',
1:'6/1/2019',
2:'7/1/2019',
3:'8/1/2019',
4:'9/1/2019',
5:'10/1/2019',
6:'11/1/2019',
7:'12/1/2019',
8:'1/1/2020',
9:'2/1/2020',
10:'3/1/2020',
11:'4/1/2020',
12:'5/1/2020',
13:'6/1/2020',
14:'7/1/2020',
15:'8/1/2020',
16:'9/1/2020',
17:'10/1/2020',
18:'11/1/2020',
19:'5/1/2019',
20:'6/1/2019',
21:'7/1/2019',
22:'8/1/2019',
23:'9/1/2019',
24:'10/1/2019'},'Diff': {0:160.4279,
1:136.0248,
2:174.0513,
3:112.0424,
4:141.8488,
5:103.5522,
6:125.6087,
7:145.2591,
8:115.5121,
9:185.7191,
10:126.7386,
11:231.3461,
12:97.02587,
13:42.85235,
14:124.666,
15:357.9974,
16:490.9587,
17:204.5478,
18:287.6025,
19:12.38486,
20:-2.61735,
21:-5.6187,
22:3.204252,
23:-25.3782,
24:-10.9717},'Percent': {0:11.108089999999999,
1:8.476797999999999,
2:9.998946,
3:5.851551000000001,
4:6.998691,
5:4.774984,
6:5.528085,
7:6.058016,
8:4.542251,
9:6.985672999999999,
10:4.455896,
11:7.786734,
12:3.02981,
13:1.298792,
14:3.729997,
15:10.326089999999999,
16:12.8358,
17:4.739428,
18:6.362292,
19:5.780551,
20:-1.15487,
21:-2.50814,
22:1.4671530000000002,
23:-11.4521,
24:-5.5913699999999995},'Date': {0:'04-01-2019 to 05-01-2019',
1:'05-01-2019 to 06-01-2019',
2:'06-01-2019 to 07-01-2019',
3:'07-01-2019 to 08-01-2019',
4:'08-01-2019 to 09-01-2019',
5:'09-01-2019 to 10-01-2019',
6:'10-01-2019 to 11-01-2019',
7:'11-01-2019 to 12-01-2019',
8:'12-01-2019 to 01-01-2020',
9:'01-01-2020 to 02-01-2020',
10:'02-01-2020 to 03-01-2020',
11:'03-01-2020 to 04-01-2020',
12:'04-01-2020 to 05-01-2020',
13:'05-01-2020 to 06-01-2020',
14:'06-01-2020 to 07-01-2020',
15:'07-01-2020 to 08-01-2020',
16:'08-01-2020 to 09-01-2020',
17:'09-01-2020 to 10-01-2020',
18:'10-01-2020 to 11-01-2020',
19:'04-01-2019 to 05-01-2019',
20:'05-01-2019 to 06-01-2019',
21:'06-01-2019 to 07-01-2019',
22:'07-01-2019 to 08-01-2019',
23:'08-01-2019 to 09-01-2019',
24:'09-01-2019 to 10-01-2019'}})fig=px.line(df,x="Date",y="Diff",color='POD')importplotly.graph_objectsasgoincluded=0lim= {'IAD': {'lower':90,'upper':350, 'color':'yellow'},
'SJCtest': {'lower':10,'upper':12, 'color':'green'}}
fori,dinenumerate(fig.data):forj,yinenumerate(d.y):ify<lim[d.name]['lower']ory>lim[d.name]['upper']:ifj==0:fig.add_traces(go.Scatter(x=[fig.data[i]['x'][j]],y=[fig.data[i]['y'][j]],mode='markers',marker=dict(color=lim[d.name]['color']),name=d.name+' threshold',legendgroup=d.name+' threshold'))included=included+1else:fig.add_traces(go.Scatter(x=[fig.data[i]['x'][j-1],fig.data[i]['x'][j]],y=[fig.data[i]['y'][j-1],fig.data[i]['y'][j]],mode='lines',# marker = dict(color='yellow'),line=dict(width=6,color=lim[d.name]['color']),name=d.name+' threshold',legendgroup=d.name+' threshold',showlegend=Falseifincluded>0elseTrue,))included=included+1fig.show()
Post a Comment for "Plotly: How To Display Different Color Segments On A Line Chart For Specified Thresholds?"