Matplotlib多子图饼图最后一个子图标题被主图覆盖问题咨询
问题产生原因
- Matplotlib的全局
plt系列接口在多子图场景下,默认作用于最后处于激活状态的子图:
遍历完所有子图后,最后一个子图处于激活状态,你后续调用的plt.title("Temp")本意是设置主图标题,实际直接覆盖了最后一个子图的自定义标题;同时plt.axis('equal')也仅作用在最后一个子图上,导致其格式异常。 - 此外你的代码还有三处语法问题会导致运行报错:缺少
numpy包导入、always_passing_list_tt变量未定义、always_failing_list_tt被重复赋值覆盖。
修复方案
- 主图标题改用画布对象的
suptitle()方法设置,避免作用到子图上 - 删掉全局的
plt.axis('equal'),改为在每个子图绘制饼图时单独设置等比例轴(也可以直接省略,pie()方法默认会保持子图等比例) - 补全缺失的变量定义和包导入,删除重复赋值语句
修正后完整代码
import numpy as np import matplotlib.pyplot as plt # 补全/修正变量定义 keep_list_tt = [6.012, 2.734, 2.76, 4.585, 4.19] eppm_plot = [0, 771, 830, 919, 1097] all_test_tt = [31.344, 31.344, 31.344, 31.344, 31.344] always_failing_list_tt = [0.112, 0.112, 0.112, 0.112, 0.112] # 这里给always_passing_list_tt补了示例值,你可以替换成自己的真实数据 always_passing_list_tt = [2,2,2,2,2] fig, axs = plt.subplots(1,len(keep_list_tt), figsize=(30,8)) labels = ["always_failing_list_tt", "always_passing_list_tt", "keep_list_tt","remove_list_tt"] explode = (0.2, 0,0.1,0.1) for i in range(len(keep_list_tt)): eppm_pie_plot = [ always_failing_list_tt[i], always_passing_list_tt[i], keep_list_tt[i], round(np.subtract(all_test_tt[i],np.add(keep_list_tt[i],np.add(always_failing_list_tt[i],always_passing_list_tt[i]))),3) ] pie = axs[i].pie(eppm_pie_plot, explode=explode,autopct="") axs[i].set_title("EPPM is - {}".format(eppm_plot[i])) # 每个子图单独设置等比例轴 axs[i].axis('equal') for j, a in enumerate(pie[2]): a.set_text("{}".format(eppm_pie_plot[j])) plt.legend(labels,bbox_to_anchor=(1.1,0.5) ) # 用fig.suptitle设置主图标题 fig.suptitle("Temp", y=1.02) plt.show()
内容的提问来源于stack exchange,提问作者Nandeep Devendra
相关产品推荐
相关产品推荐

