如何修改Python脚本以在Excel中按每行2个的网格布局导出图表
如何修改Python脚本以在Excel中按每行2个的网格布局导出图表
嘿,我来帮你搞定这个图表布局的问题!你当前的代码把所有图表都垂直堆在同一列里,而且偏移量的逻辑没处理换行,所以才会出现图表分散在奇怪位置的情况。我们只需要调整图表位置的计算逻辑,就能实现每行2个的整齐网格布局啦。
关键修改思路
原来的代码每次循环只累加垂直方向的偏移,完全没考虑水平方向的换行。现在我们要:
- 设定每行固定显示2个图表的规则
- 对每个图表计算它所在的行和列(比如第0、1个在第0行,第2、3个在第1行,以此类推)
- 根据行列位置计算对应的水平和垂直偏移,满2个后自动换行到下一行
修改后的完整代码
import pandas as pd import matplotlib.pyplot as plt import xlsxwriter import io def generate_seasonal_charts(file_path, start_date, end_date, output_file): df = pd.read_excel(file_path) df['Date'] = pd.to_datetime(df['Date']) df = df[(df['Date'] >= start_date) & (df['Date'] <= end_date)] df.set_index('Date', inplace=True) workbook = xlsxwriter.Workbook(output_file) worksheet = workbook.add_worksheet() # 定义图像尺寸和间距参数 image_width = 800 image_height = 400 charts_per_row = 2 # 控制每行显示的图表数量 x_spacing = image_width + 40 # 图表之间的水平间距 y_spacing = image_height + 20 # 行与行之间的垂直间距 # 为每列车价数据创建图表 for i, column in enumerate(df.columns): fig, ax = plt.subplots(figsize=(10, 6)) ax.plot(df.index, df[column]) ax.set_xlabel('Date') ax.set_ylabel('Price') ax.set_title(f'Seasonal Price Trend for {column}') plt.grid(True) # 把图表保存到内存缓冲区(不生成本地图片文件) buf = io.BytesIO() fig.savefig(buf, format='png') buf.seek(0) # 计算当前图表的行列位置 row_idx = i // charts_per_row # 整数除法,得到所在行号 col_idx = i % charts_per_row # 取余运算,得到所在列号 # 根据行列计算偏移量 x_offset = col_idx * x_spacing y_offset = row_idx * y_spacing # 将图表插入Excel工作表 worksheet.insert_image( x_offset, y_offset, f"Chart_{i+1}", {'image_data': buf, 'x_scale': image_width / fig.canvas.get_width_height()[0], 'y_scale': image_height / fig.canvas.get_width_height()[1]} ) plt.close(fig) # 关闭图表释放内存,避免内存溢出 workbook.close() # 函数调用示例 file_path = "chart testing.xlsx" output_file = "output.xlsx" start_date = '2018-01-01' end_date = '2023-12-31' generate_seasonal_charts(file_path, start_date, end_date, output_file)
重点修改说明
- 新增布局控制变量:
charts_per_row = 2,你可以根据需要随时调整这个数字(比如改成3就是每行3个图表) - 位置计算逻辑:
row_idx = i // charts_per_row:用整数除法算出当前图表在第几行col_idx = i % charts_per_row:用取余运算算出当前图表在该行的第几列
- 偏移量修正:
- 水平偏移
x_offset由列索引乘以「图片宽度+水平间距」得到,实现同行图表的左右排列 - 垂直偏移
y_offset由行索引乘以「图片高度+垂直间距」得到,实现换行后的上下排列
- 水平偏移
- 列遍历修正:因为你已经把
Date设为索引,df.columns直接就是所有车价列,原代码的df.columns[1:]会跳过第一列车价,现在修正后会处理所有车价数据
这样修改后,图表就会自动按每行2个的网格整齐排列,再也不会出现分散到远列的情况啦!
备注:内容来源于stack exchange,提问作者Anthony Guida
相关产品推荐
相关产品推荐

