J'ai des df tels que les suivants:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame({
  'Country': ["A", "B", "C", "D", "E", "F", "G"],
  'Answer declined': [0.000000, 0.000000, 0.000000, 0.000667, 0.000833, 0.000833, 0.000000],
  "Don't know": [0.003333, 0.000000, 0.000000, 0.001333, 0.001667, 0.000000, 0.000000],
  "No": [0.769167, 0.843333, 0.762000, 0.666000, 0.721667, 0.721667, 0.775833],
  "Yes": [0.227500, 0.156667, 0.238000, 0.332000, 0.275833, 0.277500, 0.224167]}, )
df.set_index("Country", inplace = True)

Comme j'ai plusieurs de ces df à partir desquels je veux créer des tracés, j'ai défini la fonction ci-dessous:

def bar_plot(plot_df):
    N = len(plot_df) # number of groups
    ind = np.arange(N) # x locations for the groups
    width = 0.35 # width of bars

    p_s = []
    p_s.append(plt.bar(ind, plot_df.iloc[:,0], width))
    for i in range(1,len(plot_df.columns)):
        p_s.append(plt.bar(ind, plot_df.iloc[:,i], width,
                           bottom=np.sum(plot_df.iloc[:,:i], axis=1)))

    plt.ylabel('[%]')
    plt.title('Responses by country')

    x_ticks_names = tuple([item for item in plot_df.index])

    plt.xticks(ind, x_ticks_names)
    plt.yticks(np.arange(0, 1.1, 0.1)) # ticks from, to, steps
    #if num_y_cats % 3 == 0: ncol = num_y_cats / 3
    #else: ncol = num_y_cats % 3
    ncol = 3
    plt.legend(p_s, plot_df.columns,
               bbox_to_anchor = (0.5, -0.25), # to the left; to the top
               loc = 'lower center',
               ncol = ncol,
               borderaxespad = 0)
    plt.show()
    plt.close()

L'appel de la fonction (bar_plot(df)) donne le tracé souhaité. Cependant, je souhaite manipuler / affiner les tracés et je souhaite donc intégrer le tracé dans les mpl figure et axe s mais je n'ai pas réussi à le faire , car je ne sais pas comment le faire fonctionner avec les lignes p_s = [] et p_s.append(...).

Quelqu'un pourrait-il m'aider où iraient les fig = plt.figure(), fig.add_axes() et ax1 = fig.add_subplot(111)?

Merci beaucoup! :)

1
Ivo 8 mars 2019 à 23:08

2 réponses

Meilleure réponse

Vous devez supprimer les deux dernières lignes de votre fonction. Cette ligne doit être appelée après avoir défini toutes les figures et sous-tracés.

plt.show()
plt.close()

Par exemple, après avoir supprimé ces lignes de la fonction, vous pouvez appeler la fonction à l'aide de différents sous-tracés:

plt.subplot(1,3,1)
bar_plot(df1)
plt.subplot(1,3,2)
bar_plot(df2)
plt.subplot(1,3,3)
bar_plot(df3)

Et enfin:

plt.show()
plt.close()

Je suppose que cela pourrait fonctionner.

1
fmrghack 8 mars 2019 à 20:28

La réponse suggérée résout le problème de l'intrigue affichée dans la console. Cependant, pour le fichier enregistré avec plt.savefig(filename.png), la commande bbox_inches='tight' fait l'affaire:

plt.savefig(filename.png, bbox_inches='tight')
0
Ivo 11 mars 2019 à 09:03