You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly中添加连接散点标记的Scatter轨迹并解决缩放失效问题

解决Plotly中连接标记的线条随缩放失效的问题

我正在用Plotly创建包含多轨迹的图表,其中每组包含两个仅显示标记的轨迹(基础轨迹和上方叠加轨迹),尝试用符号42(线条样式)的中间轨迹连接对应标记,但缩放图表时,这个线条标记会按比例缩小,无法持续连接对应标记。同时希望中间轨迹和另外两个轨迹同属一个legendgroup。当前代码如下:

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris_df = pd.read_csv(url,header=None,encoding='utf-8')
iris_df.columns = ['sepal length','sepal width','petal length', 'petal width', 'class']

test_fig =  go.Figure()

class_colors = {'Iris-setosa':'blue', 'Iris-versicolor':'green', 'Iris-virginica':'purple'}

for group in iris_df['class'].unique():
    iris_df_class = iris_df[iris_df['class']==group]
    test_fig.add_trace(go.Scatter(x=iris_df_class['sepal length'],
                                 y= iris_df_class['petal length'],
                                 mode='markers',
                                 marker=dict(size=10, color=class_colors[group], symbol=1),
                                 name='trace1 '+group,
                                 showlegend=True,
                                 legendgroup=group))

    test_fig.add_trace(go.Scatter(x=iris_df_class['sepal length'],
                                 y= iris_df_class['petal length']+0.5,
                                 mode='markers',
                                 marker=dict(size=10, color='red', symbol=5),
                                 name='trace2',
                                 showlegend=False,
                                 legendgroup=group))

    test_fig.add_trace(go.Scatter(x=iris_df_class['sepal length'],
                                 y= iris_df_class['petal length']+0.2,
                                 mode='markers',
                                marker_line_width = 2,
                                 marker=dict(size=20, color='black', symbol=42),
                                 name='trace-intermediate',
                                 showlegend=False,
                                 legendgroup=group))

test_fig.show()

修改方案

用标记符号模拟线条会受图表缩放影响,正确做法是创建专门的线条轨迹连接每组的对应点,这样线条宽度固定,缩放时始终保持连接状态。修改后的代码如下:

import pandas as pd
import plotly.graph_objects as go

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris_df = pd.read_csv(url, header=None, encoding='utf-8')
iris_df.columns = ['sepal length','sepal width','petal length', 'petal width', 'class']

test_fig = go.Figure()

class_colors = {'Iris-setosa':'blue', 'Iris-versicolor':'green', 'Iris-virginica':'purple'}

for group in iris_df['class'].unique():
    iris_df_class = iris_df[iris_df['class']==group]
    # 基础标记轨迹
    test_fig.add_trace(go.Scatter(x=iris_df_class['sepal length'],
                                 y= iris_df_class['petal length'],
                                 mode='markers',
                                 marker=dict(size=10, color=class_colors[group], symbol=1),
                                 name='trace1 '+group,
                                 showlegend=True,
                                 legendgroup=group))

    # 上方叠加标记轨迹
    test_fig.add_trace(go.Scatter(x=iris_df_class['sepal length'],
                                 y= iris_df_class['petal length']+0.5,
                                 mode='markers',
                                 marker=dict(size=10, color='red', symbol=5),
                                 name='trace2',
                                 showlegend=False,
                                 legendgroup=group))

    # 替换为专门的线条轨迹连接对应点
    for x, y1, y2 in zip(iris_df_class['sepal length'], 
                         iris_df_class['petal length'], 
                         iris_df_class['petal length']+0.5):
        test_fig.add_trace(go.Scatter(x=[x, x],
                                     y=[y1, y2],
                                     mode='lines',
                                     line=dict(width=2, color='black'),
                                     name='trace-intermediate',
                                     showlegend=False,
                                     legendgroup=group))

test_fig.show()

关键改动说明

  • 移除原有的trace-intermediate标记轨迹,替换为循环创建的垂直线条轨迹,每组对应点之间画一条直线
  • 线条轨迹使用mode='lines',设置固定line.width,缩放时不会改变尺寸,始终保持连接状态
  • 线条轨迹加入对应legendgroup,确保和同组的两个标记轨迹保持图例联动(点击图例时同时隐藏/显示)

内容的提问来源于stack exchange,提问作者Bob McBobson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:28:12