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
错误分析
- 图表复用错误:Matplotlib每次循环生成新图表,而你的Plotly代码只初始化一个
fig,所有曲线都叠加到同一个图中,导致DUT和VDD的曲线混乱。 - Y轴数据取值错误:
go.Scatter的y参数传了列名(温度标识),而非实际曲线数据,应该遍历每一列取数值。 - 缺少对数X轴设置:原Matplotlib用
logx=True,Plotly需手动配置X轴类型为对数。 - 标题与图例逻辑错误:原逻辑是每个图对应一个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
相关产品推荐
相关产品推荐

