[英]Plotly: change line color on line crossings
我有一個包含兩個數據系列和一個日期的數據框。 我想繪制它並在數據系列交叉時更改線條顏色。
import plotly.graph_objects as go
from plotly.subplots import make_subplots
data = {'Date': ['1.1.2020', '2.1.2020', '3.1.2020', '4.1.2020', '5.1.2020'],
'S1': [20, 21, 19, 18, 20],
'S2': [10, 11, 30, 18, 10]}
df = pd.DataFrame(data)
df['color']= df.apply(lambda row: 'black' if row['S1'] >= row['S2'] else 'red', axis=1)
fig = make_subplots(rows=1, cols=1,
vertical_spacing=0.05,
shared_xaxes=True)
fig.add_trace(go.Scatter(
x=df['Date'],
y=df['S1'],
line=dict(color='blue')),
row=1, col=1)
fig.add_trace(go.Scatter(
x=df['Date'],
y=df['S2'],
line=dict(color=list(df['color']))),
row=1, col=1)
fig.show()
編輯以增加解決方案空間:它也可以看起來像這樣 2
@Lemon:如果我使用該數據集運行您提出的解決方案
data = {'Date': ['1.1.2020', '2.1.2020', '3.1.2020', '4.1.2020', '5.1.2020', '6.1.2020', '7.1.2020', '8.1.2020', '9.1.2020', '10.1.2020'],
'S1': [20, 21, 19, 18, 20, 19, 18, 20, 20, 20],
'S2': [10, 11, 30, 18, 10, 10, 17, 30, 20, 10]}
我會得到以下結果。 我還沒有想出一種方法來消除交叉口之間的紅線。 有什么提示嗎?
工作解決方案
基於檸檬的建議,這是對我有用的解決方案
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd
data = {'Date': ['1.1.2020', '2.1.2020', '3.1.2020', '4.1.2020',
'5.1.2020', '6.1.2020', '7.1.2020', '8.1.2020', '9.1.2020',
'10.1.2020'],
'S1': [20, 21, 19, 18, 20, 19, 18, 20, 20, 20],
'S2': [10, 11, 30, 18, 10, 10, 17, 30, 20, 10]}
df = pd.DataFrame(data)
df['crossing']= df.loc[(df.S1 < df.S2) | (df.S1.shift(1) <
df.S2.shift(1)) | (df.S1.shift(-1) < df.S2.shift(-1)), 'S2']
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df['Date'],
y=df['S1'],
line=dict(color='blue')))
fig.add_trace(go.Scatter(
x=df['Date'],
y=df['S2'],
line=dict(color='black')))
fig.add_trace(go.Scatter(
x=df['Date'],
y=df['crossing'],
line=dict(color='red')))
fig.show()
結果圖表
我最初的想法遵循了同樣的 r-beginners 的想法,雖然你可以做一個更長的紅線是檢測當 S2>S1 和 (-1, 1) 范圍以你的“ S2>S1 ”行為中心時的行,使用:
df.loc[(df.S1 < df.S2) |
(df.S1.shift(1) < df.S2.shift(1)) |
(df.S1.shift(-1) < df.S2.shift(-1)), <the field you want to select>]
最終代碼應如下所示:
import plotly.graph_objects as go
from plotly.subplots import make_subplots
data = {'Date': ['1.1.2020', '2.1.2020', '3.1.2020', '4.1.2020', '5.1.2020'],
'S1': [20, 21, 19, 18, 20],
'S2': [10, 11, 30, 18, 10]}
df = pd.DataFrame(data)
df['color']= df.apply(lambda row: 'black' if row['S1'] >= row['S2'] else 'red', axis=1)
fig = make_subplots(rows=1, cols=1,
vertical_spacing=0.05,
shared_xaxes=True)
fig.add_trace(go.Scatter(
x=df['Date'],
y=df['S1'],
line=dict(color='blue')),
row=1, col=1)
fig.add_trace(go.Scatter(
x=df['Date'],
y=df['S2'],
line=dict(color='black')),
row=1, col=1)
fig.add_trace(go.Scatter(
x=df.loc[(df.S1 < df.S2) | (df.S1.shift(1) < df.S2.shift(1)) | (df.S1.shift(-1) < df.S2.shift(-1)), 'Date'],
y=df.loc[(df.S1 < df.S2) | (df.S1.shift(1) < df.S2.shift(1)) | (df.S1.shift(-1) < df.S2.shift(-1)), 'S2'],
line=dict(color='red')),
row=1, col=1)
fig.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.