将 hline 添加到散点图的现有图例条目

问题描述 投票:0回答:2

我有一个包含两个或多个不同数据集的散点图。对于每个数据集,我还添加了它们的均值线。 我想将 hline 链接到相应数据集的图例,这样如果我取消选择图例中的数据集,hline 也会消失。

这在情节中可能吗?

import pandas as pd
import plotly.graph_objects as go

df = pd.DataFrame({'x': [0, 1, 2],
                   'y1': [5, 4, 7],
                   'y2': [2, 3, 1]})
fig = go.Figure()

fig.add_trace(go.Scatter(
    x=df['x'],
    y=df['y1'],
    mode='markers',
    name='y1'
))

fig.add_trace(go.Scatter(
    x=df['x'],
    y=df['y2'],
    mode='markers',
    name='y2'
))

fig.add_hline(y=df['y1'].mean())
fig.add_hline(y=df['y2'].mean())

fig.show()
python plotly
2个回答
1
投票

首先,必须有图形支持才能反映在图例中。所以我们使用散点图的线条模式来绘制一条线。然后,设置图例组对散点图和折线图进行分组。完成此操作后,您可以通过单击显示或隐藏图例。

第二张图片是单击隐藏 y2 图例的示例。

import pandas as pd
import plotly.graph_objects as go

df = pd.DataFrame({'x': [0, 1, 2],
                   'y1': [5, 4, 7],
                   'y2': [2, 3, 1]})
fig = go.Figure()

fig.add_trace(go.Scatter(
    x=df['x'],
    y=df['y1'],
    mode='markers',
    name='y1',
    legendgroup='1'
))

fig.add_trace(go.Scatter(
    x=df['x'],
    y=df['y2'],
    mode='markers',
    name='y2',
    legendgroup='2'

))

fig.add_trace(
    go.Scatter(
        mode='lines',
        x=df['x'],
        y=[df['y1'].mean()]*len(df),
        line_color='blue',
        legendgroup='1'
    )
)
             
fig.add_trace(
    go.Scatter(
        mode='lines',
        x=df['x'],
        y=[df['y2'].mean()]*len(df),
        line_color='red',
        legendgroup='2'
    )
)

fig.show()

enter image description here

enter image description here


0
投票

解决方法是:对于每条水平/垂直线,绘制一条具有相同颜色和

visible="legendonly"
的散点线。

值得注意的是,带有

visible="legendonly"
的线条在图例中显示为半 alpha。所以为了对应,你最好使用 alpha 0.5 来绘制水平/垂直线,并使用 alpha 1.0 来绘制不可见的线。

import pandas as pd
import plotly.graph_objects as go
import plotly.express as px

COLORS = px.colors.qualitative.Plotly


def hex_to_rgba(h, alpha):
    """
    converts color value in hex format to rgba format with alpha transparency
    """
    return tuple([int(h.lstrip("#")[i : i + 2], 16) for i in (0, 2, 4)] + [alpha])


df = pd.DataFrame({"x": [0, 1, 2], "y1": [5, 4, 7], "y2": [2, 3, 1]})
fig = go.Figure()

fig.add_trace(go.Scatter(x=df["x"], y=df["y1"], mode="markers", name="y1"))
fig.add_trace(go.Scatter(x=df["x"], y=df["y2"], mode="markers", name="y2"))

fig.add_hline(
    y=df["y1"].mean(),
    line={
        "color": "rgba" + str(hex_to_rgba(h=COLORS[0], alpha=0.5)),
    },
)
fig.add_trace(
    go.Scatter(
        x=df["x"],
        y=df["y2"],
        mode="lines",
        visible="legendonly",
        name="y1 mean",
        line={
            "color": COLORS[0],
        },
    )
)

fig.add_hline(
    y=df["y2"].mean(),
    line={
        "color": "rgba" + str(hex_to_rgba(h=COLORS[1], alpha=0.5)),
    },
)
fig.add_trace(
    go.Scatter(
        x=df["x"],
        y=df["y2"],
        mode="lines",
        visible="legendonly",
        name="y2 mean",
        line={
            "color": COLORS[1],
        },
    )
)

fig.show()
© www.soinside.com 2019 - 2024. All rights reserved.