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
相关产品推荐
相关产品推荐

