使用Plotly Express如何将同一列的多数据系列绘制在同一张图中
实现双序列同图绘制的两种方案
先纠正你现有代码的两个明显错误:
- 你示例的源数据是空格分隔,但代码里用了
delimiter=',',如果实际文件是空格分隔要改成delimiter='\s+' - 你提取数值时列索引写错了:你用
df[1]筛选名称为name_a的行,说明第1列是序列名称,对应的y值应该在第2列(索引为2),你之前写loc[:,1]拿到的还是名称列,取不到数值。
方案1:用plotly express原生参数实现(最简洁)
plotly express本身支持按列自动区分多序列,不需要手动拆分DataFrame,直接用color参数指定序列名称列即可:
import pandas as pd import plotly.express as px # 读取数据,注意分隔符要和实际文件匹配,这里提前给列命名方便后续调用 df = pd.read_csv(filename_results, delimiter='\s+', header=None, names=['series_name', 'y_value']) # 一键生成双序列散点图,color参数会自动按series_name的不同值拆分系列 fig = px.scatter(df, y='y_value', color='series_name') # 如果要画折线图直接换成px.line即可 # fig = px.line(df, y='y_value', color='series_name') fig.show()
方案2:手动追加第二个系列(适配你现有拆分逻辑)
如果已经提前拆分好了两个序列的数值,可以用plotly的add_trace方法追加第二个系列:
import pandas as pd import plotly.express as px import plotly.graph_objects as go # 准备数据 df = pd.read_csv(filename_results, delimiter='\s+', header=None) df_subset_a = df.loc[df[0] == 'name_a'] # 注意列索引要和实际数据对应,如果名称在第一列索引就是0 df_subset_b = df.loc[df[0] == 'name_b'] values_a = df_subset_a.loc[:,1] values_b = df_subset_b.loc[:,1] fig = px.scatter(y=values_a, labels={'y':'name_a'}) # 追加第二个散点系列 fig.add_trace(go.Scatter(y=values_b, mode='markers', name='name_b')) # 如果是折线图就把mode改成'lines'或者'lines+markers' fig.show()
内容的提问来源于stack exchange,提问作者mcExchange
相关产品推荐
相关产品推荐

