python - How do you replace data for an existing line chart using python-pptx?
问题描述
I have a prebuilt and populated powerpoint presentation where I am modifying the data for charts and tables. I would like to retain all formatting (and much of the text), but replace the data in a line chart within a slide.
I have a function that will replace the data using a pandas data frame that works with bar charts.
def replaceCategoryChart(df, chart, skipLastCol=0):
"""
Replaces Category chartdata for a simple series chart. e.g. Nonfarm Employment
Parameters:
df: dataframe containing new data. column 0 is the categories
chart: the powerpoint shape chart.
skipLast: 0=don't skip last column, 1+ will skip that many columns from the end
Returns: replaced chart(?)
"""
cols1= list(df)
#print(cols1)
#create chart data object
chart_data = CategoryChartData()
#create categories
chart_data.categories=df[cols1[0]]
# Loop over all series
for col in cols1[1:-skipLastCol]:
chart_data.add_series(col, df[col])
#replace chart data
chart.replace_data(chart_data)
...
S0_L= pd.read_excel(EXCEL_BOOK, sheet_name="S0_L", usecols="A:F")
S0_L_chart = prs.slides[0].shapes[3].chart
print(S0_L)
replaceCategoryChart(S0_L, S0_L_chart)
...
The python file runs successfully, however, when I open the powerpoint file I get the error
Powerpoint found a problem with content in Name.pptx.
Powerpoint can attempt to repair the presentation.
If you trust the source of this presentation, click Repair.
After clicking repair, the slide I attempted to modify is replaced by a blank layout.
Because this function works for bar charts, I think there is a mistake in the way I am understanding how to use replace_data() for a line chart.
Thank you for your help!
解决方案
If your "line chart" is an "XY Scatter" chart, you'll need a different chart-data object, the XyChartData
object and then to populate its XySeries
objects: https://python-pptx.readthedocs.io/en/latest/api/chart-data.html#pptx.chart.data.XyChartData
I would recommend starting by getting it working using literal values, e.g. "South" and 1.05
, and then proceed to supply the values from Pandas dataframes. That way you're sure the python-pptx
part of your code is properly structured and you'll know where to go looking for any problems that arise.
推荐阅读
- google-apps-script - 未找到 Google 表格范围
- gradle - 我可以在不构建特定项目的情况下拥有 gradle 缓存依赖项吗
- javascript - 免费的 jqgrid 不会在 Edges 上重新加载数据
- python - 如何停止或结束一个线程然后重新启动它?
- c++ - 结合静态和动态多态的工厂方法
- javascript - Vue:未捕获的参考:未定义函数
- swiftui - 尝试创建多屏流时,SwiftUI“推送”NavigationView/NavigationLink 不起作用
- function - 如何在帕斯卡中看到 VMT?
- python - 在 Discord Python 中等待后台反应
- c# - 添加谷歌插件后版本更改时 Unity Gradle 构建失败