通过索引 add_series 中的列最大值和最小值在循环中绘制

plotting in a loop by indexing column max and min value in add_series

我正在尝试使用 xlsxwriter 绘制条形图,但我有一个数据框列表,想使用循环为每个数据框绘制条形图。所以我需要 add_seriesvaluescategories 每个数据帧,它们具有不同的大小,我如何读取每个数据帧并为每个数据帧索引最大和最小列?

# open an excel
writer = pd.ExcelWriter('pandas_charts.xlsx', engine='xlsxwriter')

for i in list(df_list):
    df = df_list[i]
    df.to_excel(writer, sheet_name=i, index=False)

    workbook = writer.book
    worksheet = writer.sheets[i]

    ## add bar chart in each sheet
    chart = workbook.add_chart({'type':'bar'})

    ## what should I replace '!B:$B' and '!A:$A'?
    chart.add_series({'values':'=' + i + '!B:$B',
                      'categories':'=' + i + '!A:$A'
                     })
    worksheet.insert_chart('D1', chart)

writer.save()

谢谢!

大多数 XlsxWriter API 都支持 A1 样式范围或 (row, col) 样式值集。这也适用于 chart.add_series()


chart.add_series({
    'categories': '=Sheet1!$A:$A',
    'values':     '=Sheet1!$B:$B',
})

# Or using a list of values instead of category/value formulas:
#     [sheetname, first_row, first_col, last_row, last_col]
chart.add_series({
    'categories': ['Sheet1', 0, 0, 4, 0],
    'values':     ['Sheet1', 0, 1, 4, 1],
})

因此在您的示例中,您可以这样做:

sheet_name = i  # Or str(i)

row_min = 1
row_max = len(df) + 1
col_min = 0
col_max = 1

chart.add_series({
    'categories': [sheet_name, row_min, col_min, row_max, col_min],
    'values':     [sheet_name, row_min, col_max, row_max, col_max],
})

另请参阅 XlsxWriter 文档中的 this Pandas chart example