J'ai créé une fonction qui permet aux histogrammes de tracer comme je l'aime (avec des barres d'erreur!).

def histoPlot(h,fmt='.',lighter_error=0.75,**kwargs):
#fig, ax = plt.subplots(1)
ax = plt.axes()
# Get the current color in the cycle     #https://stackoverflow.com/questions/28779559/how-to-set-same-color-for-markers-and-lines-in-a-matplotlib-plot-loop

color = next(ax._get_lines.prop_cycler)['color']
if all(h.uncertainties != None):
    # plot the error bar https://matplotlib.org/gallery/statistics/errorbar_features.html?highlight=error%20plot
    ax.errorbar(u.midpoints(h.bins), h.counts, yerr=h.uncertainties,color = lighten_color(color,lighter_error),fmt=fmt )
# plot the histogram
ax.step(h.bins,np.append(h.counts,h.counts[-1:]),where='post',color=color,**kwargs)

C'est parfait pour moi maintenant, je peux l'utiliser pour faire un complot complexe en une ligne simple

histoPlot(histo1,fmt=',')

Je peux aussi empiler une parcelle sur l'autre en mettant deux lignes dans la même cellule

histoPlot(histo1,fmt=',')`
histoPlot(histo2,fmt=',')

Mais je reçois un avertissement

MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.
  warnings.warn(message, mplDeprecation, stacklevel=1)

J'ai pu envoyer l'avertissement (en suivant Matplotlib : Ajout d'un axe utilisant les mêmes arguments qu'un axe précédent), mais uniquement au prix de rendre ma fonction impossible à empiler. C'est-à-dire que chaque appel de la fonction fait un nouveau cadre avec un nouveau tracé. Comment puis-je me débarrasser de cet avertissement et pouvoir toujours empiler mes parcelles ?

0
Rho Phi 15 mars 2019 à 18:48

2 réponses

Meilleure réponse

La façon habituelle serait de retourner les axes

def histoPlot(h,fmt='.',lighter_error=0.75, ax=None, **kwargs):
    #fig, ax = plt.subplots(1)
    if ax is None:
        ax = plt.axes()
    # ...
    return ax

ax = histoPlot(histo1,fmt=',')
histoPlot(histo2,fmt=',', ax=ax)
2
Jody Klymak 15 mars 2019 à 18:01

Vous définissez un nouvel objet axe à chaque fois dans votre fonction à l'aide de ax = plt.axes(). Si vous souhaitez tracer tous les histogrammes dans la même figure, vous devrez passer cet objet d'axe particulier. Voici un exemple de réponse expliquant cela

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(121)

fig, ax = plt.subplots()

def histoPlot(ax):
    ax.hist(np.random.normal(0, 1, 1000), bins=100)

histoPlot(ax)
histoPlot(ax)
histoPlot(ax)
plt.show()

enter image description here

3
Sheldore 15 mars 2019 à 15:55