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 一起使用

Matplotlib绘制散点图与条形图

在 Plotly 中将回归平面添加到 3d 散点图

Plotly 散点图趋势线出现在散点下方。如何让趋势线出现在散点图上? [Python]

Plotly:分类散点图格式