Plotly(Python)中如何在无数据位置断开折线?
在Plotly中让折线在无数据处断开的方法
你遇到的问题是因为Plotly的Scatter组件默认会按x轴顺序连接所有给定的点,不管这些点之间是否存在数据间隔。要实现折线断开,有两种常用方案:
方案一:插入NaN值断开折线
Plotly会自动忽略NaN值并断开折线,你可以在需要分隔的线段之间插入None(对应NaN)来实现间隔。
代码示例:
import pandas as pd import plotly.graph_objects as go df = pd.DataFrame(range(2,12), index=pd.date_range(start='2010-01-01', freq='d', periods=10), columns=['A']) idx_groups = [[1,2], [4,5], [7,8]] # 将索引按连续段分组 x_vals = [] y_vals = [] for group in idx_groups: # 添加当前段的x、y数据 x_vals.extend(df.index[group]) y_vals.extend(df['A'][group]) # 插入None实现折线断开 x_vals.append(None) y_vals.append(None) # 移除最后一组多余的None(避免末尾出现空点) x_vals = x_vals[:-1] y_vals = y_vals[:-1] fig = go.Figure() fig.add_trace(go.Scatter(x=x_vals, y=y_vals, mode='lines+markers')) fig.show()
或者更简洁的方式:先将原数据中缺失索引的位置设为NaN,再直接绘图:
import pandas as pd import plotly.graph_objects as go df = pd.DataFrame(range(2,12), index=pd.date_range(start='2010-01-01', freq='d', periods=10), columns=['A']) idx = [1,2,4,5,7,8] # 创建完整数据副本,将不在idx中的行设为NaN df_full = df.copy() df_full.loc[~df_full.index.isin(df.index[idx]), 'A'] = pd.NA fig = go.Figure() fig.add_trace(go.Scatter(x=df_full.index, y=df_full['A'], mode='lines+markers')) fig.show()
方案二:分多次添加折线Trace
如果数据段不多,可以直接为每一段独立的折线添加一个Scatter组件,这样各段之间自然断开。
代码示例:
import pandas as pd import plotly.graph_objects as go df = pd.DataFrame(range(2,12), index=pd.date_range(start='2010-01-01', freq='d', periods=10), columns=['A']) fig = go.Figure() # 添加第一段折线 fig.add_trace(go.Scatter(x=df.index[1:3], y=df['A'][1:3], mode='lines+markers')) # 添加第二段折线 fig.add_trace(go.Scatter(x=df.index[4:6], y=df['A'][4:6], mode='lines+markers')) # 添加第三段折线 fig.add_trace(go.Scatter(x=df.index[7:9], y=df['A'][7:9], mode='lines+markers')) fig.show()
注意:如果需要保持各段折线样式一致,在添加
Scatter时可以统一设置line参数(如line=dict(color='blue'))。
内容的提问来源于stack exchange,提问作者david78
相关产品推荐
相关产品推荐

