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

xlsxwriter生成Excel折线图如何高亮指定区域,是否需改用matplotlib

可行实现方案

方案1:保留xlsxwriter方案,用辅助面积系列实现背景高亮

该方案生成的是原生可编辑Excel图表,无需更换技术栈,实现逻辑如下:

  • 新增一列辅助数据,仅在需要高亮的时间段取值为y轴最大值,其余时段取值为0
  • 给折线图新增一个面积类型的系列,绑定该辅助列,设置半透明填充、无边框后放在图表底层,即可实现指定区域高亮效果
  • 可以将辅助列设置为隐藏,不影响表格的展示美观度

修改后的完整可运行代码如下:

import pandas as pd
import numpy as np 
import xlsxwriter

df = pd.DataFrame({"Start": pd.date_range("1-jan-2021", periods=72, freq="1H"),
                   'Cases': np.random.randint(0,100,size=(72))})

dates_tohighlight = list(pd.date_range("2-jan-2021", periods=10, freq="1H"))
highlighted_rows = df['Start'].isin(dates_tohighlight).map({True: 'background-color: green', False: 'background-color: grey'})
styler = df.style.apply(lambda _: highlighted_rows).set_properties(**{'text-align': 'center'})

# 提前定义起始行,修正原代码变量未定义的问题
start_row = 3 
writer = pd.ExcelWriter("Output2.xlsx", engine='xlsxwriter') # pylint: disable=abstract-class-instantiated     
# 只导出原数据的两列,不包含辅助列
styler.to_excel(writer, sheet_name= 'Keyser',  startrow= start_row , startcol=0, index=False, columns=['Start', 'Cases'])
workbook = writer.book # pylint: disable=E1101
worksheet = writer.sheets['Keyser'] 

(max_rows, max_cols) = df.shape
# 生成辅助列数据,高亮时段取y轴最大值,其余取0
y_max = df['Cases'].max()
df['highlight_aux'] = df['Start'].isin(dates_tohighlight).map({True: y_max, False: 0})
# 把辅助列写入Excel的C列,后续设置隐藏
for i, val in enumerate(df['highlight_aux']):
    worksheet.write(start_row + i, 2, val)
# 隐藏C列辅助数据
worksheet.set_column('C:C', None, None, {'hidden': True})

chart = workbook.add_chart({'type': 'line'})
# 原有折线系列
chart.add_series({
                'name' : 'Test Graph',            
                'values':    f'=Keyser!$B${start_row}:$B${max_rows+start_row-1}',
                'categories':     f'=Keyser!$A${start_row}:$A${max_rows+start_row-1}'})
# 新增高亮面积系列
chart.add_series({
                'name': '高亮区域',
                'values': f'=Keyser!$C${start_row}:$C${max_rows+start_row-1}',
                'fill': {'color': 'green', 'transparency': 70},
                'line': {'none': True}
})
chart.set_x_axis({'name': 'Timesteps', 'position_axis': 'on_tick', 'text_axis':True, 'num_font': {'rotation': -45}})
chart.set_y_axis({'name': 'Random numbers', 'major_gridlines': {'visible': False}})
worksheet.insert_chart('D3', chart, {'x_scale': 1.5, 'y_scale': 1.5})
writer.save()

如果你需要的是竖线边界,只需要把辅助列的逻辑调整为:在高亮时段的起始和结束位置取y轴最大值,其余取0,然后添加散点系列加垂直线即可。

方案2:改用matplotlib生成图表插入Excel

如果后续还有更复杂的图表定制需求,可以选择该方案,核心实现逻辑为:用matplotlib的ax.axvspan()方法绘制高亮区域,再将生成的图片插入Excel即可,核心代码片段如下:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10,6))
ax.plot(df['Start'], df['Cases'], label='Test Graph')
# 绘制高亮区域
start_highlight = dates_tohighlight[0]
end_highlight = dates_tohighlight[-1]
ax.axvspan(start_highlight, end_highlight, color='green', alpha=0.3)
ax.set_xlabel('Timesteps')
ax.set_ylabel('Random numbers')
plt.xticks(rotation=-45)
plt.tight_layout()
# 保存为临时图片后插入Excel
plt.savefig('temp_chart.png', dpi=150)
worksheet.insert_image('D3', 'temp_chart.png', {'x_scale': 1, 'y_scale': 1})

补充提问解答

不需要直接放弃当前的xlsxwriter方案,两种方案的优劣可根据你的使用场景选择:

  • xlsxwriter方案优势:生成的是原生可编辑Excel图表,接收方可以直接在Excel里调整数据、样式、提取图表数据,适合需要交付给他人二次编辑的场景
  • matplotlib方案优势:图表定制灵活度更高,支持更复杂的标注、自定义样式,适合不需要后续在Excel里编辑图表的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:18:04