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

Python:在同一FacetGrid图中添加两条Plotly折线图

解决Plotly FacetGrid中添加双y值折线图的问题

需求说明

在按color字段拆分的FacetGrid子图中,每个子图x轴为分类变量cut,同时绘制price(实线)和price2(虚线)两条折线,要求保留原有的颜色序列和正确图例。

遇到的问题

  • 合并两个独立绘制的FacetGrid图后,布局丢失,仅显示单张图
  • 一次传入两个y值并设置虚线后,颜色序列混乱,图例未正确更新

测试基础代码

import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
import numpy as np

diamonds = sns.load_dataset('diamonds')
diamonds['val'] = np.random.randint(1, 3, diamonds.shape[0])
diamonds['price2'] = diamonds['price'] + 5000
diamonds = diamonds.drop_duplicates(subset=['cut','color'])
color_discrete_sequence = px.colors.qualitative.G10

原有方法的问题

方法1:合并两个独立图

fig1 = px.line(diamonds,
              x = "cut", 
              y = "price",
              color = "val", 
              facet_col = "color",
              facet_col_wrap = 3,
              facet_row_spacing = 0.08,
              facet_col_spacing = 0.08, 
              markers = True,
              color_discrete_sequence = color_discrete_sequence,
              category_orders = {"cut": ['E', 'I', 'J', 'H', 'F', 'G', 'D']}
              )

fig2 = px.line(diamonds,
              x = "cut", 
              y = "price2",
              color = "val", 
              facet_col = "color",
              facet_col_wrap = 3,
              facet_row_spacing = 0.08,
              facet_col_spacing = 0.08, 
              markers = True,
              color_discrete_sequence = color_discrete_sequence,
              category_orders = {"cut": ['E', 'I', 'J', 'H', 'F', 'G', 'D']}
              )

fig2.update_traces(patch={"line": {"dash": 'dot'}}) 
fig1_2 = go.Figure(data = fig1.data + fig2.data)
fig1_2.show()

问题:直接合并data会丢失FacetGrid的布局信息,所有trace都叠加到同一个坐标轴上。

方法2:一次传入两个y值

fig = px.line(diamonds,
              x = "cut", 
              y = ["price","price2"],
              color = "val", 
              facet_col = "color",
              facet_col_wrap = 3,
              facet_row_spacing = 0.08,
              facet_col_spacing = 0.08, 
              markers = True,
              color_discrete_sequence = color_discrete_sequence,
              category_orders = {"cut": ['E', 'I', 'J', 'H', 'F', 'G', 'D']}
              )

for i in range(1,28,2):    
    fig.data[i]['line'] = dict(dash='dot') 

fig.show()

问题:颜色序列被打乱,图例无法区分price和price2,仅显示val的分类。

正确解决方案

通过重塑数据格式,将price和price2合并为一个列,新增类型标记列,这样可以直接用color和linestyle分别控制val和价格类型,完美保留FacetGrid布局和正确图例。

# 重塑数据格式
diamonds_melt = diamonds.melt(id_vars=['cut', 'color', 'val'], 
                              value_vars=['price', 'price2'],
                              var_name='price_type', 
                              value_name='price_value')

# 绘制折线图
fig = px.line(diamonds_melt,
              x='cut',
              y='price_value',
              color='val',
              line_dash='price_type',  # 用price_type控制折线样式
              facet_col='color',
              facet_col_wrap=3,
              facet_row_spacing=0.08,
              facet_col_spacing=0.08,
              markers=True,
              color_discrete_sequence=color_discrete_sequence,
              category_orders={"cut": ['E', 'I', 'J', 'H', 'F', 'G', 'D'],
                               "price_type": ['price', 'price2']},
              line_dash_map={'price': 'solid', 'price2': 'dot'}  # 指定样式映射
              )

fig.show()

效果说明

  • 每个Facet子图保留完整布局,按color拆分
  • val对应的颜色序列完全保留
  • price显示为实线,price2显示为虚线,图例同时展示颜色和折线样式的对应关系

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:17:11