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

求助:Matplotlib子图重复绘制且输出6幅相同图而非1幅的问题

问题排查与修复方案

错误原因

  • 循环逻辑嵌套错误:你用到的4列数据正好有6组i<j的不重复两两组合,对应6张子图。但原代码在每次匹配到有效i,j组合后,又套了一层遍历6个子图位置的循环,导致同一组散点数据被重复绘制到当前画布的所有子图上。
  • plt.show() 调用位置错误:该方法被放在i,j循环的内部,每处理完一组i,j组合就会渲染一次画布并清空,自然就生成了6张独立画布。

修复后代码

import matplotlib.pyplot as plt

def scatter(df, column_name):
    values = {data: list(df[data]) for data in column_name}
    data = list(values.values())
    labels = list(values.keys())
    # 提前初始化子图位置计数器
    subplot_idx = 0
    
    for i in range(len(data)):
        for j in range(len(data)):
            if i == j:
                continue
            elif (i == 1) & (j == 0):
                continue
            elif (i == 2) & ((j == 0)|(j == 1)):
                continue
            elif (i == 3) & ((j == 0)|(j == 1)|(j == 2)):
                continue
            else:
                # 每次匹配到有效组合,对应画到下一个子图位置
                subplot_idx += 1
                ax = plt.subplot(3, 2, subplot_idx)
                plt.scatter(data[i], data[j])
                plt.xlabel(labels[i])
                plt.ylabel(labels[j])
                plt.title('{} vs {}'.format(labels[i], labels[j]))
    # 所有子图绘制完成后统一展示
    plt.tight_layout() # 可选,避免子图标签重叠
    plt.show()

scatter(roller_coasters, ['speed', 'height', 'length', 'num_inversions'])

逻辑优化建议

你原来写的多层i,j过滤规则其实等价于只保留i < j的组合,可以简化判断逻辑,代码更易读:

for i in range(len(data)):
    for j in range(i+1, len(data)):
        subplot_idx += 1
        ax = plt.subplot(3, 2, subplot_idx)
        plt.scatter(data[i], data[j])
        plt.xlabel(labels[i])
        plt.ylabel(labels[j])
        plt.title('{} vs {}'.format(labels[i], labels[j]))

内容的提问来源于stack exchange,提问作者Aidan Payne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:54:03