如何迭代散点数据?

How to iterate over scatter data?

我正在尝试使用 Plotly Express 在带有下拉框的散点图上绘制时间序列。我在数据的“名称”列中过滤了一些唯一值的 2 条轨迹。我在 px.scatter 上使用 'color' 函数按此列进行过滤。由于迹线具有相同的名称,它们在图上是重复的,我无法分辨哪个迹线属于哪个 'color'。 我想根据颜色更改每个名称。我正在尝试遍历 fig.data,因为我能够将我的值存储在列表 labels 中(见下文)但未能成功遍历迹线的名称,因为它是散点类型.

早些时候,我可以通过以下方式对其进行硬编码,但是,我需要它是动态的:

fig.data[0]['name'] = "color1 var1"
fig.data[1]['name'] = "color2 var1"
fig.data[2]['name'] = "color1 var2"
fig.data[3]['name'] = "color2 var2"

为了使其动态化,我尝试了这个并且能够更新值,但每个值都更新为我列表中的最后一个值。我想按列表的顺序更新每个值。不知道该怎么做。

labels = df['name'].unique().tolist()
for i in range(len(labels)):
    x = labels[i]+" Color2"
    labels.append(x)

for n in fig.data:
    for i in n:
        for q in range(len(labels)):
            if i == 'name':
                n[i] = labels[q]

这是我用于下拉图的代码(数据是时间序列):

def tsplot(title,df):
# Create figure with secondary y-axis
    fig = make_subplots(specs=[[{"secondary_y": True}]])
    labels = df['name'].unique().tolist() #for var1
    
    for i in range(len(labels)):
        x = labels[i]+" for var2"
        labels.append(x)

    # Add traces
    trace1 = px.scatter(df, x="day", y="campaign_cpc", color="display_env_name", hover_name="display_env_name",
                       color_discrete_sequence=px.colors.qualitative.Set3).update_traces(
    mode="lines")

    trace2 = px.scatter(df, x="day", y="market_cpc", color="display_env_name", hover_name='display_env_name',
                        color_discrete_sequence=px.colors.qualitative.Antique,).update_traces(
    mode="lines")
    
    trace2.update_traces(yaxis="y2")
    
    fig.add_traces(trace1.data + trace2.data)

buttons = [{"label": t.name,
                    "method": "update",
                    "args": [{"visible": [t2.legendgroup == t.legendgroup for t2 in fig.data]}],
                     } for t in fig.data[0:3]]  

    fig.update_layout(
    updatemenus=[
        {   "y": 1.1,
            "buttons": buttons,
            "active": 0
            }
        ]
    )

我找到了使用 for 循环更改跟踪名称的解决方案。

请注意:df['color'] 默认包含 var1。添加var2时,我们不需要删除var1。

   labels = df['color'].unique().tolist()
    
    for i in range(len(labels)):
        x = labels[i]+" var2"
        labels.append(x)
    
    for n in range(len(fig.data)):
        fig.data[n].name = labels[n]