在Databricks中使用plotnine绘图重复显示及修改不生效问题求助
解决Databricks中plotnine图表重复显示及修改不生效问题
一、图表重复显示的处理方案
在Databricks环境中,直接在单元格末尾输出ggplot对象(即写my_plot)会触发Notebook的自动输出机制,加上变量持久化特性,导致后续运行任意单元格时旧图表重复渲染。可通过以下方式解决:
显式控制绘图与画布清理
借助matplotlib的方法显式输出图表,并在绘图后关闭画布,避免缓存旧内容:import matplotlib.pyplot as plt # 重新定义绘图对象 my_plot = (ggplot(df, aes(x='x', y='y')) + geom_col(show_legend=True) + scale_x_discrete(name='Familia') + scale_y_continuous(name='Número de prendas', breaks=range(0, 8000+1, 2000)) + ggtitle('Número de prendas por familia') + theme(figure_size=(8,6), panel_grid_major_y=element_line(color='000', size=0.3, linetype='solid'), panel_grid_minor_y=element_line(color='000', size=0.2, linetype='dashed')) ) # 绘制、显示并清理画布 my_plot.draw() plt.show() plt.close()plt.close()会彻底关闭当前matplotlib画布,杜绝后续重复渲染旧图表的可能。直接链式调用绘图(不存储变量)
跳过变量赋值,直接在单元格内链式执行绘图代码,避免持久化的绘图对象被重复触发:%matplotlib inline (ggplot(df, aes(x='x', y='y')) + geom_col(show_legend=True) + scale_x_discrete(name='Familia') + scale_y_continuous(name='Número de prendas', breaks=range(0, 8000+1, 2000)) + ggtitle('Número de prendas por familia') + theme(figure_size=(8,6), panel_grid_major_y=element_line(color='000', size=0.3, linetype='solid'), panel_grid_minor_y=element_line(color='000', size=0.2, linetype='dashed')) ).draw()
二、修改图表后不生效的解决方法
使用my_plot.draw()后修改代码不生效,核心原因是旧的绘图对象仍被缓存,需遵循以下操作流程:
- 修改
my_plot的定义代码后,必须重新运行定义my_plot的单元格,确保变量指向新的绘图配置。 - 运行包含
my_plot.draw() + plt.show() + plt.close()的单元格,通过plt.close()清理旧画布,加载新的绘图内容。
也可以直接采用「链式调用绘图」的方式,每次修改后直接运行完整代码,彻底规避旧对象缓存问题。
内容的提问来源于stack exchange,提问作者Nacho Arévalo Evans
相关产品推荐
相关产品推荐

