使用稀疏DataFrame绘制Pandas折线图有间隙,需保留分段颜色并连通线条
解决折线图分段有间隙且保留各段颜色的方法
你的代码里每列数据被NaN分隔成独立段,pandas默认绘制时会因为NaN断开线条。要实现连通且保留各段颜色,可以手动绘制每一段并连接相邻分段的首尾点,具体步骤如下:
完整代码示例
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 初始化数据 dfx = pd.DataFrame() dfx['bing'] = [1,2,3,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan] dfx['bang'] = [np.nan,np.nan,np.nan,4,5,6,np.nan,np.nan,np.nan] dfx['boo'] = [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,7,8,9] # 提取每列的有效数据(非NaN)及其索引 segments = [] for col in dfx.columns: valid_data = dfx[col].dropna() segments.append( (valid_data.index, valid_data.values) ) # 获取pandas默认的颜色循环,对应各列颜色 colors = plt.rcParams['axes.prop_cycle'].by_key()['color'] # 绘制图形 plt.figure(figsize=(8, 4)) # 绘制第一个分段 first_idx, first_vals = segments[0] plt.plot(first_idx, first_vals, color=colors[0], label=dfx.columns[0], linewidth=2) # 绘制后续分段并连接前一段终点 for i in range(1, len(segments)): prev_idx, prev_vals = segments[i-1] curr_idx, curr_vals = segments[i] # 连接前一段最后一个点与当前段第一个点 plt.plot([prev_idx[-1], curr_idx[0]], [prev_vals[-1], curr_vals[0]], color=colors[i], linewidth=2) # 绘制当前分段 plt.plot(curr_idx, curr_vals, color=colors[i], label=dfx.columns[i], linewidth=2) plt.legend() plt.show()
原理说明
- 先提取每列的非NaN数据及其对应的索引,得到三个独立的数据分段;
- 调用matplotlib默认的颜色循环,保证各分段颜色和pandas默认绘图一致;
- 先绘制第一个分段,再依次绘制后续分段,同时用当前分段的颜色连接前一段的终点和当前段的起点,实现整条折线连通;
- 保留原列名作为图例,和原绘图的展示逻辑一致。
内容的提问来源于stack exchange,提问作者David Yang
相关产品推荐
相关产品推荐

