基于Python+Jupyter/Voila实现交互式图表生成PPT
解决方案:将交互式图表参数对应图表嵌入PPT
核心修改思路
要实现根据当前控件参数生成对应图表并嵌入PPT,需完成三个关键步骤:
- 编写能根据控件参数生成并保存图表的函数
- 在PPT生成流程中调用该函数,生成对应图片
- 将生成的图片插入到PPT的新幻灯片中
修改后的完整代码
import pandas as pd import matplotlib.pyplot as plt import ipywidgets as widgets from IPython.display import display import plotly.express as px from pptx import Presentation from pptx.util import Inches, Pt from pptx.dml.color import RGBColor import os # 加载数据集 df = pd.read_csv("chocolate_sales.csv") df = df.head(100) # 定义交互式控件 xax = widgets.Dropdown(options=df.columns, value='revenue') yax = widgets.Dropdown(options=df.columns, value='cost') obs = widgets.IntSlider(value=50, min=10, max=100) # 交互式图表展示函数 def graph_plotly(x_col, y_col, samplesize): dataset = df.head(samplesize) fig = px.scatter(dataset, x=x_col, y=y_col) fig.update_layout(title=f"散点图: {y_col} vs {x_col}", xaxis_title=x_col, yaxis_title=y_col) fig.show() # 生成并保存对应参数的图表图片 def generate_chart_image(x_col, y_col, samplesize): dataset = df.head(samplesize) fig = px.scatter(dataset, x=x_col, y=y_col) fig.update_layout(title=f"散点图: {y_col} vs {x_col}", xaxis_title=x_col, yaxis_title=y_col) # 保存为临时图片 fig.write_image("temp_chart.png") # 生成PPT的函数,包含插入图表逻辑 def make_presentation(): # 创建PPT对象 prs = Presentation() # 添加标题页 title_slide_layout = prs.slide_layouts[0] slide = prs.slides.add_slide(title_slide_layout) title = slide.shapes.title title.text = "巧克力销售数据分析报告" title.text_frame.paragraphs[0].font.color.rgb = RGBColor(0, 0, 0) # 改为黑色确保可见 # 添加图表幻灯片 image_slide_layout = prs.slide_layouts[5] # 空白布局 chart_slide = prs.slides.add_slide(image_slide_layout) # 根据当前控件参数生成图表图片 generate_chart_image(xax.value, yax.value, obs.value) # 设置图片位置和大小 left = Inches(1) top = Inches(1) width = Inches(8) height = Inches(5) chart_slide.shapes.add_picture("temp_chart.png", left, top, width=width, height=height) # 保存PPT prs.save('巧克力销售报告.pptx') # 删除临时图片(可选) if os.path.exists("temp_chart.png"): os.remove("temp_chart.png") # 按钮及点击逻辑 button = widgets.Button( description='生成PPT', disabled=False, button_style='success', tooltip='点击生成包含当前图表的PPT', icon='file-powerpoint-o' ) output = widgets.Output() def button_action(b): with output: output.clear_output() make_presentation() print("PPT生成完成!") button.on_click(button_action) # 显示交互式控件和按钮 out = widgets.interactive_output(graph_plotly, {'x_col': xax, 'y_col': yax, 'samplesize': obs}) display(widgets.VBox([widgets.HBox([xax, yax, obs]), out, button, output]))
关键修改说明
- 独立图表生成保存函数:新增
generate_chart_image函数,专门根据当前控件的xax.value、yax.value、obs.value生成图表并保存为图片,确保PPT中的图表和交互式展示的图表参数完全一致。 - PPT插入图表逻辑:在
make_presentation中,先调用generate_chart_image生成对应参数的图片,再通过add_picture方法将图片插入到新建的空白幻灯片中。 - 修复控件参数传递:原
graph_plotly函数直接使用xax.value而非传入的参数,修改后使用函数参数x_col和y_col,保证交互式展示的参数一致性。 - 优化细节:调整标题字体颜色为黑色(避免原白色在默认模板中不可见),添加临时图片清理逻辑,优化按钮样式和提示文本。
运行说明
- 确保已安装所有依赖包:
pip install pandas plotly ipywidgets python-pptx - 运行代码后,调整下拉框和滑块参数,点击「生成PPT」按钮,即可得到包含当前参数对应图表的PPT文件。
内容的提问来源于stack exchange,提问作者PMaier
相关产品推荐
相关产品推荐

