2012-07-23 8 views
24

Używam Python 2.7 i matplotlib. Mam * .txt plik danych:Jak wykreślić bardzo prosty wykres słupkowy (Python, Matplotlib) za pomocą pliku wejściowego * .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 

pierwszej kolumnie mojego pliku (numery) należy na osi Y w moim wykresie słupkowym, a druga kolumna z mojego pliku (daty) powinny znajdować się na osi OX w mój histogram. Wiem tylko, jak czytać ten plik:

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!") 

Zrobiłem czytać dokumentację matplotlib ale to wciąż nie pomaga mi. Chciałbym też dodać dat czytam moim wykresie słupkowym, aby wyglądać jak

this

Czy ktoś mógłby mi pomóc?

Odpowiedz

29

Mówisz o histogramy, ale to nie całkiem sensowne. Histogramy i wykresy słupkowe to różne rzeczy. Histogram będzie na przykład wykresem słupkowym przedstawiającym sumę wartości na rok. Tutaj po prostu wydajesz się być po barach.

Powyżej znajduje się pełna przykładów z danymi, który pokazuje pasek dla każdej wymaganej wartości na każdy dzień:

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() 

musisz analizować datę z strptime i ustawić oś x korzystania z dat (jak opisano w this answer).

Jeśli nie jesteś zainteresowany posiadaniem osi x wykazują liniową skalę czasową, ale po prostu chcesz bary z etykietami, można to zrobić w zamian:

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

EDIT: Po komentarze, dla wszystkich kleszczy, a im się koncentrować, przechodzą do zakresu set_ticks (i przenieść je o połowę szerokości bar):

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) 
+0

to jest świetne, ale czy istnieje sposób na ustawienie etykiet na osi x bardziej pionowo na zdjęcie? Nie będzie dobrze wyglądać z dużą ilością danych na osi X. Ale dzięki, na pewno skorzystam z twojego przykładu :) – mazix

+0

Zmień kąt obrotu. – Bruno

+0

dzięki :) Jeszcze jedno: jak ustawić te etykiety daty tuż pod każdym pojemnikiem? Próbowałem z innym kątem obrotu, ale to nie wystarczy: http://s6.ifotos.pl/img/chartpng_raqrsaq.png – mazix

4

Po pierwsze, to, czego szukasz, to kolumna lub wykres słupkowy, tak naprawdę nie jest histogramem. Histogram składa się z rozkładu częstotliwości zmiennej ciągłej, która jest podzielona na przedziały. Tutaj masz kolumnę przeciwko oddzielnym etykietom.

Aby utworzyć wykres słupkowy z matplotlib, należy użyć metody matplotlib.pyplot.bar(). Zajrzyj do this page dokumentacji matplotlib, która bardzo dobrze wyjaśnia przykłady i jak to zrobić.

Jeśli jednak jest to możliwe, proponuję, aby w przypadku prostego zadania, takiego jak ten, uniknąć pisania kodu, który byłby lepszy. Jeśli masz jakiś program do obsługi arkuszy kalkulacyjnych, to powinno to być bułka z masłem, ponieważ jest to dokładnie to, na czym on polega, i nie będziesz musiał "wymyślać koła na nowo". Poniżej znajduje się wykres danych w programie Excel:

Bar diagram plot in Excel

po prostu skopiowane dane z pytaniem, używane Kreatora importu tekstu, aby umieścić go w dwóch kolumnach, potem dodaje schemat kolumny.

+2

Dzięki za odpowiedź, ale muszę to zrobić w Pythonie. – mazix

+7

To nie jest wymyślanie koła, używa innego narzędzia. Przy użyciu argumentu nie byłoby sensu uczenie się rysowania wykresów liniowych w matplotlib, ponieważ można by to zrobić w Excelu – Anake

+2

", gdyby można było uniknąć pisania kodu, który byłby lepszy". czemu? nie mogę sobie wyobrazić, że wiele osób na SO będzie sympatyzować z tym stwierdzeniem. – dbliss

24

Ten kod zrobi to, czego szukasz. Opiera się na przykładach znalezionych here i here.

Wywołanie autofmt_xdate() jest szczególnie przydatne do nadawania etykiet osi X.

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

+0

'width = 0.75' działa lepiej. Umieszcza xticks w środku pasków – dreme

+2

'ind = np.arange (len (OY)) NameError: nazwa 'OY' nie jest zdefiniowana' – manetsus