You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
    

深色环境显示异常修复要点

  1. 同步patchworklib的全局样式与Seaborn配置
  2. 手动设置标题、坐标轴标签及刻度的文本颜色为浅色,适配深色背景
  3. 确保每个绘图容器继承全局样式配置

内容的提问来源于stack exchange,提问作者jakub.deka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:58:31