求助: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
相关产品推荐
相关产品推荐

