Plotly:将时间序列/烛台图与气泡/散点图相结合
Posted
技术标签:
【中文标题】Plotly:将时间序列/烛台图与气泡/散点图相结合【英文标题】:Plotly: combine timeseries/candlestick chart with bubble/scatter plot 【发布时间】:2021-11-30 06:43:47 【问题描述】:是否可以将烛台图与气泡散点图与 plotly 结合起来?样本数据:
| date | open | high | low | close | value |
| -------- | ------| ------| ------| ------| ------|
| 01/09/2021 | 64.00 | 65.25 | 64.80 | 65.00 | 1000 |
| 02/09/2021 | 65.00 | 66.25 | 65.00 | 66.00 | NaN |
| 03/09/2021 | 66.00 | 67.00 | 65.95 | 67.00 | NaN |
| 04/09/2021 | 68.00 | 68.25 | 66.85 | 68.00 | -500 |
| 07/09/2021 | 68.00 | 68.50 | 66.75 | 67.00 | NaN |
| 08/09/2021 | 67.00 | 67.25 | 64.50 | 65.00 | NaN |
| 09/09/2021 | 65.00 | 65.50 | 64.00 | 64.00 | 2000 |
例如,我希望在 65、68、64 的价格水平上出现一个气泡,而具有正值的气泡为绿色(如 2021 年 1 月 9 日和 2021 年 9 月 9 日)和负值的气泡值为红色(截至 2021 年 4 月 9 日)。
现在我有以下代码,它给了我一个图表,如附图所示。
fig.add_trace(
go.Candlestick(x=df['date'],
open=df['open'],
high=df['high'],
low=df['low'],
close=df['close'],
yaxis= "y2"
),
row = 1, col=2
)
fig.add_trace(go.Scatter(line=dict(color='rgb(30,46,185)'),
x=df['date'], y = df['close'],
mode='markers',
),
row = 1, col=2
)
【问题讨论】:
您的样本数据不完整,它没有 OHLC 的所有 5 列 你是对的。我认为 OHL 对于解决问题并不重要。但是,我刚刚在示例数据中添加了虚构的 OHL。-@Rob Raymond 【参考方案1】: 有问题的样本数据集不完整,所以使用plotly样本数据集。重命名列以使其与您的代码一致 您可以在同一图中创建散点跟踪和烛台跟踪。一个关键要求,确保两者都使用相同的yaxis
。默认烛台使用y2
颜色或气泡/散布由数组定义,其中没有要绘制的值 (NaN
) 它使用透明。
您似乎使用了子图,因此需要注意使 yaxis 保持一致
# fmt: off
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv")
df = df.rename(columns=s: t for s, t in zip(df.columns, [c.strip("APPL").strip(".").lower() for c in df.columns]))
df = df.head(20)
df["value"] = np.random.choice([1000, -500, np.nan], len(df))
# fmt: on
go.Figure(
[
go.Scatter(
x=df["date"],
y=df["close"],
mode="markers",
marker_color=np.select(
[df["value"] > 0, df["value"] < 0], ["green", "red"], "rgba(0,0,0,0)"
),
yaxis="y2",
name="Bubble"
),
go.Candlestick(
x=df["date"],
open=df["open"],
high=df["high"],
low=df["low"],
close=df["close"],
yaxis="y2",
name="Candlestick"
),
]
).update_layout(xaxis_rangeslider_visible=False)
“气泡”的连续颜色
import numpy as np
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
# fmt: off
df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv")
df = df.rename(columns=s: t for s, t in zip(df.columns, [c.strip("APPL").strip(".").lower() for c in df.columns]))
df = df.head(20)
df["value"] = np.random.randint(-500, 1000, len(df))
df.loc[df.sample(10).index, "value"] = np.nan
# fmt: on
go.Figure(
[
px.scatter(
df.loc[
~df["value"].isna(),
],
x="date",
y="close",
color="value",
color_continuous_scale="Viridis",
)
.update_traces(yaxis="y2", marker_size=20)
.data[0],
go.Candlestick(
x=df["date"],
open=df["open"],
high=df["high"],
low=df["low"],
close=df["close"],
yaxis="y2",
name="Candlestick",
),
]
).update_layout(xaxis_rangeslider_visible=False, coloraxis_colorbar_y=0.35)
【讨论】:
进一步回答我的问题:我尝试根据值使每个“气泡”的颜色不同。假设 df['value'] 中的所有值都是正数,我希望较高的值具有较深的颜色,反之亦然。我试过这条线:marker=dict(size=20,color=df['value'], colorscale='Viridis'),但这并没有改变任何东西。 - @Rob Raymond 用 Plotly Express 做连续颜色要简单得多以上是关于Plotly:将时间序列/烛台图与气泡/散点图相结合的主要内容,如果未能解决你的问题,请参考以下文章
如何根据交叉点的大小在 Plotly 中构建具有气泡大小的气泡图?
在 Shiny 中通过串扰将 Plotly 与 DT 一起使用