如何在Python中将绘图存储为变量复用(类似R的实现方式)
在Python中实现类似R的可复用绘图对象生成与组合
需求背景
希望编写数据集探索代码时,通过函数生成独立的绘图对象,在Jupyter Notebook中按需调用展示、组合,就像R中用ggplot2+ggpubr实现的效果:
# install.packages("tidyverse") # install.packages("ggpubr") supress_all <- function(e) {suppressPackageStartupMessages(suppressWarnings(e))} supress_all(library(tidyverse)) supress_all(library(ggpubr)) # 调整Jupyter中的绘图尺寸 options(repr.plot.width = 10, repr.plot.height = 4) make_me_a_plot <- function(data, x_name, y_name) { res <- ggplot() + geom_point(aes(x = data[[x_name]], y = data[[y_name]])) + labs(title = paste0(x_name, " vs ", y_name), x = x_name, y = y_name) return(res) } # 生成独立绘图对象 p1 <- make_me_a_plot(mtcars, "mpg", "hp") p2 <- make_me_a_plot(mtcars, "mpg", "wt") p3 <- make_me_a_plot(mtcars, "mpg", "qsec") # 按需组合展示 ggarrange(p1, p2, ncol = 2, nrow = 1)
初始尝试的问题
用Matplotlib/Seaborn的原生写法无法生成独立绘图对象,调用plt.show()会把所有图叠加在同一画布:
import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns plt.ioff() mtcars = sns.load_dataset('mpg') def make_me_a_plot(data, x_name, y_name): res = plt.scatter(x=data[[x_name]], y=data[[y_name]]) return res p1 = make_me_a_plot(mtcars, 'mpg', 'horsepower') p2 = make_me_a_plot(mtcars, 'mpg', 'weight') p3 = make_me_a_plot(mtcars, 'mpg', 'acceleration') # plt.show()会将所有图绘制在同一画布,不符合需求
可行解决方案(含深色环境修复)
使用patchworklib可以实现类似R的绘图对象管理,同时针对深色环境显示异常问题做适配:
实现可复用绘图对象生成函数
import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns import patchworklib as pw # 统一配置样式,适配深色环境 plt.ioff() sns.set_style("darkgrid") pw.rcParams["patchworklib.style"] = "darkgrid" mtcars = sns.load_dataset("mpg") def make_me_a_plot( data: pd.DataFrame, x_name: str, y_name: str, ) -> pw.Brick: # 创建独立的绘图容器 ax = pw.Brick(figsize=(6, 4)) sns.scatterplot( x=x_name, y=y_name, data=data, ax=ax, s=16, ) ax.set_title(f"{x_name} vs. {y_name}") # 适配深色背景的文本颜色 ax.title.set_color("white") ax.xaxis.label.set_color("white") ax.yaxis.label.set_color("white") ax.tick_params(axis='both', colors='white') return ax # 生成独立绘图对象 p1 = make_me_a_plot(mtcars, "mpg", "horsepower") p2 = make_me_a_plot(mtcars, "mpg", "weight") p3 = make_me_a_plot(mtcars, "mpg", "acceleration")
按需调用与组合
- 单独展示某张图:直接调用对象即可
p1 - 组合展示多张图:使用
patchworklib的拼接语法# 横向拼接两张图 p1 | p2 # 纵向拼接两张图 p1 / p3 # 复杂组合布局 (p1 | p2) / p3
深色环境显示异常修复要点
- 同步
patchworklib的全局样式与Seaborn配置 - 手动设置标题、坐标轴标签及刻度的文本颜色为浅色,适配深色背景
- 确保每个绘图容器继承全局样式配置
内容的提问来源于stack exchange,提问作者jakub.deka
相关产品推荐
相关产品推荐

