web-dev-qa-db-fra.com

Comment tracer un graphique à barres très simple (Python, Matplotlib) en utilisant le fichier input * .txt?

J'utilise Python 2.7 et matplotlib. J'ai un fichier de données * .txt:

0 14-11-2003
1 15-03-1999
12 04-12-2012
33 09-05-2007
44 16-08-1998
55 25-07-2001
76 31-12-2011
87 25-06-1993
118 16-02-1995
119 10-02-1981
145 03-05-2014

la première colonne de mon fichier (numéros) doit figurer sur l'axe Y de mon diagramme à barres et la deuxième colonne de mon fichier (dates) sur l'axe OX de mon histogramme. Je sais seulement comment lire le fichier:

OX = []
OY = []

try :
    with open('data.txt', 'r') as openedFile :
        for line in openedFile :
            tab = line.split()
            OY.append(int(tab[0]))
            OX.append(str(tab[1]))
except IOError :
    print("IOError!")

J'ai lu une documentation matplotlib mais cela ne m'aide toujours pas. Je voudrais aussi ajouter les dates que j'ai lues à mon graphique à barres, pour le faire ressembler

this

Quelqu'un pourrait-il m'aider s'il vous plaît?

25
mazix

Vous parlez d'histogrammes, mais cela n'a pas vraiment de sens. Les histogrammes et les graphiques à barres sont des choses différentes. Un histogramme serait un graphique à barres représentant la somme des valeurs par an, par exemple. Ici, vous semblez juste être après les bars.

Voici un exemple complet de vos données qui montre une barre de pour chaque valeur requise à chaque date:

import pylab as pl
import datetime

data = """0 14-11-2003
1 15-03-1999
12 04-12-2012
33 09-05-2007
44 16-08-1998
55 25-07-2001
76 31-12-2011
87 25-06-1993
118 16-02-1995
119 10-02-1981
145 03-05-2014"""

values = []
dates = []

for line in data.split("\n"):
    x, y = line.split()
    values.append(int(x))
    dates.append(datetime.datetime.strptime(y, "%d-%m-%Y").date())

fig = pl.figure()
ax = pl.subplot(111)
ax.bar(dates, values, width=100)
ax.xaxis_date()

Vous devez analyser la date avec strptime et définir l’axe des x pour qu’il utilise les dates (comme décrit dans cette réponse ).

Si vous ne souhaitez pas que l'axe des abscisses affiche une échelle de temps linéaire, mais souhaitez uniquement des barres avec des étiquettes, vous pouvez le faire à la place:

fig = pl.figure()
ax = pl.subplot(111)
ax.bar(range(len(dates)), values)

EDIT: Après les commentaires, pour tous les ticks et pour qu’ils soient centrés, passez la plage à set_ticks (et les déplacer de la moitié de la largeur de la barre):

fig = pl.figure()
ax = pl.subplot(111)
width=0.8
ax.bar(range(len(dates)), values, width=width)
ax.set_xticks(np.arange(len(dates)) + width/2)
ax.set_xticklabels(dates, rotation=90)
30
Bruno

Ce code fera ce que vous cherchez. Il est basé sur des exemples trouvés ici et ici .

L'appel autofmt_xdate() est particulièrement utile pour rendre les étiquettes de l'axe des abscisses lisibles.

import numpy as np
from matplotlib import pyplot as plt

fig = plt.figure()

width = .35
ind = np.arange(len(OY))
plt.bar(ind, OY, width=width)
plt.xticks(ind + width / 2, OX)

fig.autofmt_xdate()

plt.savefig("figure.pdf")

enter image description here

24
David Robinson

Tout d’abord, vous recherchez un colonne ou diagramme en barres, pas vraiment un histogramme. Un histogramme est constitué d’une distribution de fréquence d’une variable continue qui est séparée en cases. Ici vous avez une colonne contre des étiquettes séparées.

Pour créer un diagramme en barres avec matplotlib, utilisez la méthode matplotlib.pyplot.bar(). Regardez cette page de la documentation de matplotlib qui explique très bien avec des exemples et code source comment le faire.

Si cela est possible cependant, je suggérerais simplement que, pour une tâche aussi simple que celle-ci, vous évitiez d'écrire du code, ce serait mieux. Si vous avez un programme de tableur, cela devrait être un morceau de gâteau parce que c'est exactement ce à quoi ils servent, et vous n'aurez pas à "réinventer la roue". Voici le tracé de vos données dans Excel:

Bar diagram plot in Excel

Je viens de copier vos données de la question, d'utiliser l'assistant d'importation de texte pour les mettre en deux colonnes, puis d'insérer un diagramme en colonnes.

3
Abhranil Das