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

Matplotlib转Plotly绘制多折线图效果不符,请求排查错误

Plotly替代Matplotlib实现多组合折线图的错误排查与修正

我有一段Matplotlib代码,能够根据不同DUT与VDD组合生成多幅折线图(每幅图包含多条对应不同温度的曲线,X轴为对数刻度)。改用Plotly实现相同效果时,绘图展示不符合预期。以下是两段代码、示例数据,请求排查代码错误并给出正确实现方法。

Matplotlib代码

index = LFRO_tdms["Measurement Config"].as_dataframe()["Frequencies"]
for vdd in set_vdds:
    for DUT in unique_DUTs:
        temp_df = df[ (df["Serial"] == str(DUT)) & (df["VDD (V)"]==vdd) ]
        temp_df["Serial ID - Temp(C)"] = temp_df["Serial"] + " - " + temp_df["Target Temp (°C)"].astype(dtype=str)
        df_LFRO_data_to_plot = df_LFRO[temp_df["#Magnitude"].to_numpy(dtype=str)]
        df_LFRO_data_to_plot.index = index
        df_LFRO_data_to_plot.columns = temp_df["Serial ID - Temp(C)"]
        df_LFRO_data_to_plot.plot(logx=True, colormap="jet")
        plt.title("Unit: "+ DUT + " Vdd: " + str(vdd))

Plotly问题代码

fig = go.Figure()
index = LFRO_tdms["Measurement Config"].as_dataframe()["Frequencies"]
for vdd in set_vdds:
    for DUT in unique_DUTs:
        temp_df = df[ (df["Serial"] == str(DUT)) & (df["VDD (V)"]==vdd) ]
        temp_df["Serial ID - Temp(C)"] = temp_df["Serial"] + " - " + temp_df["Target Temp (°C)"].astype(dtype=str)
        df_LFRO_data_to_plot = df_LFRO[temp_df["#Magnitude"].to_numpy(dtype=str)]
        df_LFRO_data_to_plot.index = index
        df_LFRO_data_to_plot.columns = temp_df["Serial ID - Temp(C)"]
        
#         df_LFRO_data_to_plot.plot(logx=True, colormap="jet")
#         plt.title("Unit: "+ DUT + " Vdd: " + str(vdd))
        fig.add_traces(go.Scatter(x=df_LFRO_data_to_plot.index, y=df_LFRO_data_to_plot.columns, mode='lines', name = ("Unit: "+ DUT + " Vdd: " + str(vdd))))
        fig.show()

示例数据

Test    Station Position    Serial  Timestamp   ETC Temp (°C)   ETC Pressure (kPa)  ETC Humidity (%RH)  Ref Mic Temp (°C)   Site Temp (°C)  Target Temp (°C)    VDD (V) LFRO (Hz)   #Magnitude
0   1   1   1   07LX-1  2022-11-17 23:05:51.591926  23.151848   99.334515   3.564379    14.349645   -30.041135  -35.0   1.60    9.221194    0
1   1   1   2   07LX-2  2022-11-17 23:05:51.591926  23.151848   99.334515   3.564379    14.349645   -30.257592  -35.0   1.60    8.995556    1
2   1   1   3   07LX-3  2022-11-17 23:05:51.591926  23.151848   99.334515   3.564379    14.349645   -30.511629  -35.0   1.60    9.452866    2
3   1   1   4   07LX-4  2022-11-17 23:05:51.591926  23.151848   99.334515   3.564379    14.349645   -29.863173  -35.0   1.60    9.299079    3
4   1   1   1   07LX-1  2022-11-17 23:09:41.373825  22.475499   99.338778   3.574306    12.311989   -28.114924  -35.0   1.66    7.390171    4

错误分析

  1. 图表复用错误:Matplotlib每次循环生成新图表,而你的Plotly代码只初始化一个fig,所有曲线都叠加到同一个图中,导致DUT和VDD的曲线混乱。
  2. Y轴数据取值错误:go.Scatter的y参数传了列名(温度标识),而非实际曲线数据,应该遍历每一列取数值。
  3. 缺少对数X轴设置:原Matplotlib用logx=True,Plotly需手动配置X轴类型为对数。
  4. 标题与图例逻辑错误:原逻辑是每个图对应一个DUT+VDD组合,图内曲线对应不同温度;你现在把DUT+VDD作为曲线名称,完全颠倒了层级。

正确Plotly实现代码

import plotly.graph_objects as go

index = LFRO_tdms["Measurement Config"].as_dataframe()["Frequencies"]
for vdd in set_vdds:
    for DUT in unique_DUTs:
        temp_df = df[(df["Serial"] == str(DUT)) & (df["VDD (V)"] == vdd)]
        temp_df["Serial ID - Temp(C)"] = temp_df["Serial"] + " - " + temp_df["Target Temp (°C)"].astype(str)
        df_LFRO_data_to_plot = df_LFRO[temp_df["#Magnitude"].to_numpy(dtype=str)]
        df_LFRO_data_to_plot.index = index
        df_LFRO_data_to_plot.columns = temp_df["Serial ID - Temp(C)"]
        
        # 为当前DUT+VDD组合创建独立图表
        fig = go.Figure()
        # 遍历不同温度的列,添加曲线
        for col in df_LFRO_data_to_plot.columns:
            fig.add_trace(go.Scatter(
                x=df_LFRO_data_to_plot.index,
                y=df_LFRO_data_to_plot[col],
                mode='lines',
                name=col  # 图例显示温度标识
            ))
        # 配置图表布局,对齐原Matplotlib效果
        fig.update_layout(
            title=f"Unit: {DUT} Vdd: {vdd}",
            xaxis_type="log",
            xaxis_title="Frequencies",
            yaxis_title="LFRO Value",
            template="plotly_white"
        )
        # 展示当前图表
        fig.show()

修正说明

  • 将fig初始化放入循环内部,确保每个DUT+VDD组合对应独立图表。
  • 遍历数据列,用列的实际数值作为Y轴数据,列名作为曲线名称(对应不同温度)。
  • 通过xaxis_type="log"设置X轴为对数刻度,补充标题和轴标签。
  • 每个图表单独调用fig.show(),保证组合间的图独立展示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:20:51