如何为Python Plotly go.Scatter(mode="lines")添加Y轴抖动以避免线条重叠
Plotly 解决线条重叠、添加Y轴抖动并让短线居上的实现方案
现有如下DataFrame,需要为每个索引绘制从Starting point到Walking的绿色线条,以及从Starting point到Driving的红色线条,但原代码绘制的线条出现重叠,需修改代码实现:
- 为不同类别的线条添加Y轴抖动效果,避免重叠
- 让较短的线条显示在较长线条的上方
原DataFrame:
Starting point Walking Driving Lunch 0 8 4 Shopping 0 7 3 Coffee 0 5 2
修改后的完整代码
import pandas as pd import plotly.graph_objects as go df7 = pd.DataFrame({ 'Starting point': [0, 0, 0], 'Walking': [8, 7, 5], 'Driving': [4, 3, 2] }, index=['Lunch', 'Shopping', 'Coffee']) fig9 = go.Figure() # 定义各列的样式配置:颜色、Y轴偏移量 col_config = { 'Walking': {'color': '#00A86B', 'y_offset': 0.1}, # 绿色,向上偏移 'Driving': {'color': '#E2062B', 'y_offset': -0.1} # 红色,向下偏移 } # 将字符串索引转为数值化Y轴位置,方便添加偏移 y_base = {idx: pos for pos, idx in enumerate(df7.index)} for idx in df7.index: # 按线长从长到短排序,先画长线再画短线,确保短线显示在上方 sorted_cols = sorted(col_config.keys(), key=lambda c: df7.loc[idx, c], reverse=True) for col in sorted_cols: cfg = col_config[col] # 获取当前线条的X值 x_data = df7.loc[idx, ["Starting point", col]] # 生成带偏移的Y值 y_data = [y_base[idx] + cfg['y_offset']] * len(x_data) fig9.add_trace( go.Scatter( y=y_data, x=x_data, showlegend=False, mode="lines+markers", marker={"color": cfg['color'], "symbol": "diamond"}, line={"color": cfg['color']} ) ) # 还原Y轴为原始索引标签 fig9.update_layout( yaxis=dict( tickmode='array', tickvals=list(y_base.values()), ticktext=list(y_base.keys()) ) ) fig9.show()
关键修改说明
- Y轴数值化与偏移:把字符串索引转为数值位置,给不同类别的线条添加±0.1的偏移量,实现抖动效果,彻底避免线条重叠
- 控制绘制顺序:对每个索引,先绘制长线(数值更大的列),再绘制短线(数值更小的列)——Plotly中后添加的轨迹会显示在上方,确保短线居上
- 样式绑定:用字典直接映射列对应的颜色和偏移,逻辑清晰易维护
- 还原Y轴标签:通过
tickvals和ticktext把数值化的Y轴还原为原始索引名称,保证图表可读性
内容的提问来源于stack exchange,提问作者plotmaster473
相关产品推荐
相关产品推荐

