我有一个包含两个或多个不同数据集的散点图。对于每个数据集,我还添加了它们的均值线。 我想将 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()
首先,必须有图形支持才能反映在图例中。所以我们使用散点图的线条模式来绘制一条线。然后,设置图例组对散点图和折线图进行分组。完成此操作后,您可以通过单击显示或隐藏图例。
第二张图片是单击隐藏 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()
解决方法是:对于每条水平/垂直线,绘制一条具有相同颜色和
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()