90 votes

Matplotlib - étiqueter chaque bac

Je suis actuellement à l'aide de Matplotlib pour créer un histogramme:

enter image description here

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as pyplot
...
fig = pyplot.figure()
ax = fig.add_subplot(1,1,1,)
n, bins, patches = ax.hist(measurements, bins=50, range=(graph_minimum, graph_maximum), histtype='bar')

#ax.set_xticklabels([n], rotation='vertical')

for patch in patches:
    patch.set_facecolor('r')

pyplot.title('Spam and Ham')
pyplot.xlabel('Time (in seconds)')
pyplot.ylabel('Bits of Ham')
pyplot.savefig(output_filename)

Je voudrais faire le x-étiquettes de l'axe un peu plus de sens.

Tout d'abord, l'axe des x tiques ici semblent être limités à cinq tiques. Peu importe ce que je fais, je n'arrive pas à changer cela - même si je peux ajouter plus de xticklabels, il utilise seulement les cinq premiers. Je ne suis pas sûr de savoir comment Matplotlib calcule cela, mais je suppose que c'est de l'auto-calculée à partir de la gamme/données?

Est-il possible que je peux augmenter la résolution de x-étiquettes de graduation , au point même d'un pour chaque bar/bin?

(Idéalement, j'aimerais aussi l'secondes pour être reformaté en micro-secondes/milli-secondes, mais c'est une question pour un autre jour).

Deuxièmement, j'aimerais que chaque barre marqué - avec le nombre réel de ce bac ainsi que le pourcentage du total de toutes les cellules.

Le résultat final devrait ressembler à quelque chose comme ceci:

enter image description here

C'est quelque chose comme que possible avec Matplotlib?

Cheers, Victor

140voto

Joe Kington Points 68089

Sûr! Pour régler les ticks, eh bien ... Définissez les ticks (voir matplotlib.pyplot.xticks ou ax.set_xticks ). (De plus, vous n'avez pas besoin de définir manuellement la couleur de façade des patchs. Vous pouvez simplement passer un argument de mot clé.)

Pour le reste, vous aurez besoin de faire des choses un peu plus sophistiquées avec l’étiquetage, mais matplotlib facilite les choses.

Par exemple:

 import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import FormatStrFormatter

data = np.random.randn(82)
fig, ax = plt.subplots()
counts, bins, patches = ax.hist(data, facecolor='yellow', edgecolor='gray')

# Set the ticks to be at the edges of the bins.
ax.set_xticks(bins)
# Set the xaxis's tick labels to be formatted with 1 decimal place...
ax.xaxis.set_major_formatter(FormatStrFormatter('%0.1f'))

# Change the colors of bars at the edges...
twentyfifth, seventyfifth = np.percentile(data, [25, 75])
for patch, rightside, leftside in zip(patches, bins[1:], bins[:-1]):
    if rightside < twentyfifth:
        patch.set_facecolor('green')
    elif leftside > seventyfifth:
        patch.set_facecolor('red')

# Label the raw counts and the percentages below the x-axis...
bin_centers = 0.5 * np.diff(bins) + bins[:-1]
for count, x in zip(counts, bin_centers):
    # Label the raw counts
    ax.annotate(str(count), xy=(x, 0), xycoords=('data', 'axes fraction'),
        xytext=(0, -18), textcoords='offset points', va='top', ha='center')

    # Label the percentages
    percent = '%0.0f%%' % (100 * float(count) / counts.sum())
    ax.annotate(percent, xy=(x, 0), xycoords=('data', 'axes fraction'),
        xytext=(0, -32), textcoords='offset points', va='top', ha='center')


# Give ourselves some more room at the bottom of the plot
plt.subplots_adjust(bottom=0.15)
plt.show()
 

entrez la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X