在 python 中的 plotly 中添加财务图中的阈值线
Adding threshold lines in financial plots in plotly in python
我正在 python 中的 Plotly 中绘制财务子图,我能够成功。但是我需要在第二个子图中绘制阈值线(水平线),但不能绘制相同的线。
但我能够在独立绘图中成功绘制阈值线。
我的带有三个阈值线的独立图的代码
fig = go.Figure(data=[go.Scatter(x=VipData['Date'], y=VipData['RSI5'], name='RSI5')])
fig.update_layout(
title='VIP Stock',
yaxis_title='Price',
xaxis_title='Period',
shapes=[# Top Threshold line
{
'type': 'line',
'xref': 'paper',
'x0': 0,
'y0': 70, # use absolute value or variable here
'x1': 1,
'y1': 70, # ditto
'line': {
'color': 'rgb(0, 100, 0)',
'width': 1,
'dash': 'dash',
},
},
# Bottom Threshold Line
{
'type': 'line',
'xref': 'paper',
'x0': 0,
'y0': 30, # use absolute value or variable here
'x1': 1,
'y1': 30, # ditto
'line': {
'color': 'rgb(255, 0, 0)',
'width': 1,
'dash': 'dash',
},
},
# Middle Threshold Line
{
'type': 'line',
'xref': 'paper',
'x0': 0,
'y0': 50, # use absolute value or variable here
'x1': 1,
'y1': 50, # ditto
'line': {
'color': 'rgb(0, 0, 0)',
'width': 1,
'dash': 'dash',
},
},
],
xaxis=dict(
rangeselector=dict(
buttons=list([
dict(count=1,
label="1m",
step="month",
stepmode="backward"),
dict(count=6,
label="6m",
step="month",
stepmode="backward"),
dict(count=1,
label="YTD",
step="year",
stepmode="todate"),
dict(count=1,
label="1y",
step="year",
stepmode="backward"),
dict(step="all")
])
),
rangeslider=dict(
visible=True
),
type="date"
)
)
fig.show()
下面是我的子图的代码:
fig = make_subplots(
rows=2, cols=1,
shared_xaxes=True,
vertical_spacing=0.01,
specs=[[{"type": "Candlestick"}],
[{"type": "scatter"}]]
)
fig.add_trace(go.Candlestick(x=VipData['Date'].tail(30), open=VipData['Open'].tail(30), high=VipData['High'].tail(30),
low=VipData['Low'].tail(30), close=VipData['Close'].tail(30), name='Candlestick'),row=1, col=1)
fig.add_trace(go.Scatter(x=VipData['Date'].tail(30), y=VipData['RSI5'].tail(30), name='RSI5'),row=2, col=1)
fig.update_layout(xaxis_rangeslider_visible=False)
我应该对我的代码进行哪些更改以绘制与我的第二个图相似的三个阈值线,即第 2 行中的图。
感谢您的宝贵时间和指导。
问候
苏迪尔
添加根据@As11 共享的代码创建的绘图
示例数据
Index Date Open High Low Close Volume RSI5 RSI7 RSI14 RSI20
4629 2021-02-24 381.899994 396.500000 366.200012 384.000000 432314 70.793970 68.529922 62.909907 60.583804
4630 2021-02-25 388.799988 403.500000 385.049988 391.799988 595109 78.694615 74.588730 66.485293 63.246338
4631 2021-02-26 389.950012 414.950012 381.000000 400.700012 1657646 84.626277 79.772785 70.034771 66.004475
4632 2021-03-01 409.399994 412.500000 396.000000 406.149994 1564155 87.327001 82.345797 71.990981 67.573037
4633 2021-03-02 408.350006 412.799988 396.049988 398.000000 974849 65.739595 67.389979 65.142286 62.997502
4634 2021-03-03 402.700012 418.000000 396.799988 408.549988 601591 75.528227 74.409265 69.223823 66.123166
4635 2021-03-04 410.000000 422.000000 406.799988 409.950012 1203652 76.635561 75.234577 69.730348 66.518241
4636 2021-03-05 416.799988 417.899994 400.950012 411.399994 757044 77.928511 76.163442 70.275987 66.938582
4637 2021-03-08 416.399994 416.399994 405.600006 409.299988 474313 70.832312 71.624317 68.354198 65.681480
4638 2021-03-09 412.500000 412.500000 400.100006 402.899994 447689 52.589322 59.100838 62.724568 61.949272
4639 2021-03-10 405.000000 405.000000 397.799988 401.000000 374909 48.001544 55.726081 61.115323 60.868426
4640 2021-03-12 403.000000 406.750000 390.000000 392.850006 387427 32.704021 43.340983 54.639686 56.423455
4641 2021-03-15 391.500000 392.000000 379.049988 384.200012 351942 22.985685 33.987634 48.737186 52.167366
4642 2021-03-16 386.500000 387.149994 376.450012 379.899994 398165 19.402892 30.206902 46.072717 50.186440
4643 2021-03-17 375.350006 388.899994 373.049988 380.450012 812165 21.362683 31.346550 46.475797 50.439827
4644 2021-03-18 387.000000 387.000000 366.250000 372.399994 282166 14.785330 24.512076 41.577488 46.774263
4645 2021-03-19 373.000000 381.250000 370.000000 376.250000 394137 28.032068 32.699461 44.585582 48.652822
4646 2021-03-22 379.750000 380.950012 371.000000 375.399994 257526 26.878940 31.810773 44.046361 48.256999
4647 2021-03-23 372.149994 382.000000 372.000000 373.149994 234016 23.658731 29.347633 42.578426 47.187317
4648 2021-03-24 373.149994 376.950012 361.000000 367.399994 571290 17.110434 23.843211 39.001213 44.531932
4649 2021-03-25 365.399994 366.750000 352.250000 357.299988 292795 10.642696 17.223262 33.652906 40.335152
4650 2021-03-26 363.500000 363.500000 348.000000 350.299988 260489 8.017250 14.065566 30.528256 37.740355
4651 2021-03-30 351.049988 356.950012 338.700012 347.250000 367289 7.067658 12.866452 29.253742 36.658738
4652 2021-03-31 349.000000 357.250000 347.500000 354.149994 248493 30.384842 28.871121 35.785243 40.705512
4653 2021-04-01 357.000000 361.200012 351.000000 354.450012 192683 31.321411 29.527758 36.061654 40.878392
4654 2021-04-05 354.450012 354.450012 339.000000 342.200012 275972 18.570212 20.508825 30.322389 36.326258
4655 2021-04-06 345.000000 348.799988 340.000000 343.399994 237563 22.436682 23.190015 31.472914 37.049091
4656 2021-04-07 343.700012 347.350006 340.200012 342.500000 232796 21.480478 22.525218 31.058690 36.719996
4657 2021-04-08 345.750000 347.000000 341.399994 343.600006 255827 26.280462 25.567863 32.232666 37.434998
4658 2021-04-09 345.399994 345.500000 340.000000 341.000000 144333 22.259995 23.069502 30.893569 36.411390
我无法重现你的图表,因为我没有你正在使用的数据,但根据我能够弄清楚的,你应该能够通过做你所用的同样的事情来获得阈值线在独立情节中做了。所以完整的代码应该是这样的:
fig = make_subplots(
rows=2, cols=1,
shared_xaxes=True,
vertical_spacing=0.01,
specs=[[{"type": "Candlestick"}],
[{"type": "scatter"}]]
)
fig.add_trace(go.Candlestick(x=VipData['Date'].tail(30), open=VipData['Open'].tail(30), high=VipData['High'].tail(30),
low=VipData['Low'].tail(30), close=VipData['Close'].tail(30), name='Candlestick'),row=1, col=1)
fig.add_trace(go.Scatter(x=VipData['Date'].tail(30), y=VipData['RSI5'].tail(30), name='RSI5'),row=2, col=1)
fig.update_layout(xaxis_rangeslider_visible=False)
fig.update_layout(
title='VIP Stock',
yaxis_title='Price',
xaxis_title='Period',
shapes=[# Top Threshold line
{
'type': 'line',
'xref': 'paper',
'yref': 'y2',
'x0': 0,
'y0': 70, # use absolute value or variable here
'x1': 1,
'y1': 70, # ditto
'line': {
'color': 'rgb(0, 100, 0)',
'width': 1,
'dash': 'dash',
},
},
# Bottom Threshold Line
{
'type': 'line',
'xref': 'paper',
'yref': 'y2',
'x0': 0,
'y0': 30, # use absolute value or variable here
'x1': 1,
'y1': 30, # ditto
'line': {
'color': 'rgb(255, 0, 0)',
'width': 1,
'dash': 'dash',
},
},
# Middle Threshold Line
{
'type': 'line',
'xref': 'paper',
'yref': 'y2',
'x0': 0,
'y0': 50, # use absolute value or variable here
'x1': 1,
'y1': 50, # ditto
'line': {
'color': 'rgb(0, 0, 0)',
'width': 1,
'dash': 'dash',
},
},
],
xaxis=dict(
rangeselector=dict(
buttons=list([
dict(count=1,
label="1m",
step="month",
stepmode="backward"),
dict(count=6,
label="6m",
step="month",
stepmode="backward"),
dict(count=1,
label="YTD",
step="year",
stepmode="todate"),
dict(count=1,
label="1y",
step="year",
stepmode="backward"),
dict(step="all")
])
),
rangeslider=dict(
visible=True
),
type="date"
)
)
fig.show()
要在第二个子图中显示它,您必须在每个线条形状中添加 'yref':'y2'
,如上面的代码所示。
我正在 python 中的 Plotly 中绘制财务子图,我能够成功。但是我需要在第二个子图中绘制阈值线(水平线),但不能绘制相同的线。
但我能够在独立绘图中成功绘制阈值线。
我的带有三个阈值线的独立图的代码
fig = go.Figure(data=[go.Scatter(x=VipData['Date'], y=VipData['RSI5'], name='RSI5')])
fig.update_layout(
title='VIP Stock',
yaxis_title='Price',
xaxis_title='Period',
shapes=[# Top Threshold line
{
'type': 'line',
'xref': 'paper',
'x0': 0,
'y0': 70, # use absolute value or variable here
'x1': 1,
'y1': 70, # ditto
'line': {
'color': 'rgb(0, 100, 0)',
'width': 1,
'dash': 'dash',
},
},
# Bottom Threshold Line
{
'type': 'line',
'xref': 'paper',
'x0': 0,
'y0': 30, # use absolute value or variable here
'x1': 1,
'y1': 30, # ditto
'line': {
'color': 'rgb(255, 0, 0)',
'width': 1,
'dash': 'dash',
},
},
# Middle Threshold Line
{
'type': 'line',
'xref': 'paper',
'x0': 0,
'y0': 50, # use absolute value or variable here
'x1': 1,
'y1': 50, # ditto
'line': {
'color': 'rgb(0, 0, 0)',
'width': 1,
'dash': 'dash',
},
},
],
xaxis=dict(
rangeselector=dict(
buttons=list([
dict(count=1,
label="1m",
step="month",
stepmode="backward"),
dict(count=6,
label="6m",
step="month",
stepmode="backward"),
dict(count=1,
label="YTD",
step="year",
stepmode="todate"),
dict(count=1,
label="1y",
step="year",
stepmode="backward"),
dict(step="all")
])
),
rangeslider=dict(
visible=True
),
type="date"
)
)
fig.show()
fig = make_subplots(
rows=2, cols=1,
shared_xaxes=True,
vertical_spacing=0.01,
specs=[[{"type": "Candlestick"}],
[{"type": "scatter"}]]
)
fig.add_trace(go.Candlestick(x=VipData['Date'].tail(30), open=VipData['Open'].tail(30), high=VipData['High'].tail(30),
low=VipData['Low'].tail(30), close=VipData['Close'].tail(30), name='Candlestick'),row=1, col=1)
fig.add_trace(go.Scatter(x=VipData['Date'].tail(30), y=VipData['RSI5'].tail(30), name='RSI5'),row=2, col=1)
fig.update_layout(xaxis_rangeslider_visible=False)
感谢您的宝贵时间和指导。
问候 苏迪尔
添加根据@As11 共享的代码创建的绘图
示例数据
Index Date Open High Low Close Volume RSI5 RSI7 RSI14 RSI20
4629 2021-02-24 381.899994 396.500000 366.200012 384.000000 432314 70.793970 68.529922 62.909907 60.583804
4630 2021-02-25 388.799988 403.500000 385.049988 391.799988 595109 78.694615 74.588730 66.485293 63.246338
4631 2021-02-26 389.950012 414.950012 381.000000 400.700012 1657646 84.626277 79.772785 70.034771 66.004475
4632 2021-03-01 409.399994 412.500000 396.000000 406.149994 1564155 87.327001 82.345797 71.990981 67.573037
4633 2021-03-02 408.350006 412.799988 396.049988 398.000000 974849 65.739595 67.389979 65.142286 62.997502
4634 2021-03-03 402.700012 418.000000 396.799988 408.549988 601591 75.528227 74.409265 69.223823 66.123166
4635 2021-03-04 410.000000 422.000000 406.799988 409.950012 1203652 76.635561 75.234577 69.730348 66.518241
4636 2021-03-05 416.799988 417.899994 400.950012 411.399994 757044 77.928511 76.163442 70.275987 66.938582
4637 2021-03-08 416.399994 416.399994 405.600006 409.299988 474313 70.832312 71.624317 68.354198 65.681480
4638 2021-03-09 412.500000 412.500000 400.100006 402.899994 447689 52.589322 59.100838 62.724568 61.949272
4639 2021-03-10 405.000000 405.000000 397.799988 401.000000 374909 48.001544 55.726081 61.115323 60.868426
4640 2021-03-12 403.000000 406.750000 390.000000 392.850006 387427 32.704021 43.340983 54.639686 56.423455
4641 2021-03-15 391.500000 392.000000 379.049988 384.200012 351942 22.985685 33.987634 48.737186 52.167366
4642 2021-03-16 386.500000 387.149994 376.450012 379.899994 398165 19.402892 30.206902 46.072717 50.186440
4643 2021-03-17 375.350006 388.899994 373.049988 380.450012 812165 21.362683 31.346550 46.475797 50.439827
4644 2021-03-18 387.000000 387.000000 366.250000 372.399994 282166 14.785330 24.512076 41.577488 46.774263
4645 2021-03-19 373.000000 381.250000 370.000000 376.250000 394137 28.032068 32.699461 44.585582 48.652822
4646 2021-03-22 379.750000 380.950012 371.000000 375.399994 257526 26.878940 31.810773 44.046361 48.256999
4647 2021-03-23 372.149994 382.000000 372.000000 373.149994 234016 23.658731 29.347633 42.578426 47.187317
4648 2021-03-24 373.149994 376.950012 361.000000 367.399994 571290 17.110434 23.843211 39.001213 44.531932
4649 2021-03-25 365.399994 366.750000 352.250000 357.299988 292795 10.642696 17.223262 33.652906 40.335152
4650 2021-03-26 363.500000 363.500000 348.000000 350.299988 260489 8.017250 14.065566 30.528256 37.740355
4651 2021-03-30 351.049988 356.950012 338.700012 347.250000 367289 7.067658 12.866452 29.253742 36.658738
4652 2021-03-31 349.000000 357.250000 347.500000 354.149994 248493 30.384842 28.871121 35.785243 40.705512
4653 2021-04-01 357.000000 361.200012 351.000000 354.450012 192683 31.321411 29.527758 36.061654 40.878392
4654 2021-04-05 354.450012 354.450012 339.000000 342.200012 275972 18.570212 20.508825 30.322389 36.326258
4655 2021-04-06 345.000000 348.799988 340.000000 343.399994 237563 22.436682 23.190015 31.472914 37.049091
4656 2021-04-07 343.700012 347.350006 340.200012 342.500000 232796 21.480478 22.525218 31.058690 36.719996
4657 2021-04-08 345.750000 347.000000 341.399994 343.600006 255827 26.280462 25.567863 32.232666 37.434998
4658 2021-04-09 345.399994 345.500000 340.000000 341.000000 144333 22.259995 23.069502 30.893569 36.411390
我无法重现你的图表,因为我没有你正在使用的数据,但根据我能够弄清楚的,你应该能够通过做你所用的同样的事情来获得阈值线在独立情节中做了。所以完整的代码应该是这样的:
fig = make_subplots(
rows=2, cols=1,
shared_xaxes=True,
vertical_spacing=0.01,
specs=[[{"type": "Candlestick"}],
[{"type": "scatter"}]]
)
fig.add_trace(go.Candlestick(x=VipData['Date'].tail(30), open=VipData['Open'].tail(30), high=VipData['High'].tail(30),
low=VipData['Low'].tail(30), close=VipData['Close'].tail(30), name='Candlestick'),row=1, col=1)
fig.add_trace(go.Scatter(x=VipData['Date'].tail(30), y=VipData['RSI5'].tail(30), name='RSI5'),row=2, col=1)
fig.update_layout(xaxis_rangeslider_visible=False)
fig.update_layout(
title='VIP Stock',
yaxis_title='Price',
xaxis_title='Period',
shapes=[# Top Threshold line
{
'type': 'line',
'xref': 'paper',
'yref': 'y2',
'x0': 0,
'y0': 70, # use absolute value or variable here
'x1': 1,
'y1': 70, # ditto
'line': {
'color': 'rgb(0, 100, 0)',
'width': 1,
'dash': 'dash',
},
},
# Bottom Threshold Line
{
'type': 'line',
'xref': 'paper',
'yref': 'y2',
'x0': 0,
'y0': 30, # use absolute value or variable here
'x1': 1,
'y1': 30, # ditto
'line': {
'color': 'rgb(255, 0, 0)',
'width': 1,
'dash': 'dash',
},
},
# Middle Threshold Line
{
'type': 'line',
'xref': 'paper',
'yref': 'y2',
'x0': 0,
'y0': 50, # use absolute value or variable here
'x1': 1,
'y1': 50, # ditto
'line': {
'color': 'rgb(0, 0, 0)',
'width': 1,
'dash': 'dash',
},
},
],
xaxis=dict(
rangeselector=dict(
buttons=list([
dict(count=1,
label="1m",
step="month",
stepmode="backward"),
dict(count=6,
label="6m",
step="month",
stepmode="backward"),
dict(count=1,
label="YTD",
step="year",
stepmode="todate"),
dict(count=1,
label="1y",
step="year",
stepmode="backward"),
dict(step="all")
])
),
rangeslider=dict(
visible=True
),
type="date"
)
)
fig.show()
要在第二个子图中显示它,您必须在每个线条形状中添加 'yref':'y2'
,如上面的代码所示。