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

如何修改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)

重点修改说明

  1. 新增布局控制变量:charts_per_row = 2,你可以根据需要随时调整这个数字(比如改成3就是每行3个图表)
  2. 位置计算逻辑:
    • row_idx = i // charts_per_row:用整数除法算出当前图表在第几行
    • col_idx = i % charts_per_row:用取余运算算出当前图表在该行的第几列
  3. 偏移量修正:
    • 水平偏移x_offset由列索引乘以「图片宽度+水平间距」得到,实现同行图表的左右排列
    • 垂直偏移y_offset由行索引乘以「图片高度+垂直间距」得到,实现换行后的上下排列
  4. 列遍历修正:因为你已经把Date设为索引,df.columns直接就是所有车价列,原代码的df.columns[1:]会跳过第一列车价,现在修正后会处理所有车价数据

这样修改后,图表就会自动按每行2个的网格整齐排列,再也不会出现分散到远列的情况啦!

备注:内容来源于stack exchange,提问作者Anthony Guida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:14:50