Search code examples
pythonpandasmatplotlibpie-chart

matplotlib pie chart replacing last pie subplot title with actual title of the main plot


I have been running into an issue where matplotlib pie is replacing my last value of subplot text with actual plot title. Could anyone tell me why i am facing the issue and how to overcome it?

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_failing_list_tt = [23.203, 23.203, 23.203, 23.203, 23.203]

import matplotlib.pyplot as plt

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]))
    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) )
plt.axis('equal')
plt.title ("Temp")
plt.show()

Temp showing up instead of EPPM eppm_showing_up_with weird formatting


Solution

  • The issue seems to be caused by the fact that plt.axis('equal') is applied only to the last graph outside the loop process. Please move that code inside the loop. And while you're at it, optimize the way the graph is looped.

    import matplotlib.pyplot as plt
    
    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, ax in enumerate(fig.axes):
        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 = ax.pie(eppm_pie_plot, explode=explode, autopct="")
        ax.set_title("EPPM is - {}".format(eppm_plot[i]))
        ax.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))
    
    #plt.axis('equal')
    fig.suptitle("Temp")
    
    plt.show()
    

    enter image description here