Prosty wykres słupkoway w pythonie, problem z labelami na osi

0

Mam taki kod, który rysuje mi wykres słupkowy. Problem mam z tym, że trochę brzydko to wygląda, tzn. te labele na ox nie są dokładnie "pod" odpowiednimi słupkami ... Jak to poprawić?

Kod:

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(range(len(dates)), values)
ax.set_xticklabels(dates, rotation=30)
pl.show()

daje mi taki obrazek:

user image

0

Może być?

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 = fig.add_subplot(1,1,1)

ax.bar(range(len(dates)), values, facecolor='#777777',
       align='center', width=0.5, ecolor='black')

ax.set_xticks(range(len(dates)))

ax.set_xticklabels(dates)

fig.autofmt_xdate()
pl.show()
0

Fajne, tylko przy dużej ilości danych te daty się nakładają. Próbowałem coś z tą rotacją, ale nic to nie dało. Da się jakoś pionowo te daty na OX ustawić?

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
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
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
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 = fig.add_subplot(1,1,1)
 
ax.bar(range(len(dates)), values, facecolor='#777777',
       align='center', width=0.5, ecolor='black')
 
ax.set_xticks(range(len(dates)))
pl.yticks(values) 
ax.set_xticklabels(dates, rotation = 90)
 
fig.autofmt_xdate()
pl.show()

daje taki wykres:

user image

0

wyrzuć linijkę fig.autofmt_xdate()

0

@Spine: rzeczywiście, podziałało:) A czy jest jakiś sposób na to, żeby na rysunku ustawić odstępy pomiędzy datami? Tak w kodzie? Szukałem w dokumentacji matplotlib, ale nie wiem, czy nie potrafię znaleźć, czy nie ma czegoś takiego. Dziękuję:)

0

Sprawdź sobie to:

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
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
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
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(dpi=60,figsize=(18, 10))
ax = fig.add_subplot(1,1,1)

fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.2)


ax.bar(range(len(dates)), values, facecolor='#777777',
       align='center', width=0.5, ecolor='black')
pl.axis('tight')
ax.set_xticks(range(len(dates)))
pl.yticks(values)
ax.set_xticklabels(dates, rotation = 90)

 
pl.show()

Trochę się naszukałem, żeby zmienić marginesy wykresu (przy samym usunięciu fig.autofmt_xdate() u mnie daty wyjeżdżały poza obszar rysowania).
A co do odstępów między datami to spróbuj w linijce fig = pl.figure(dpi=60,figsize=(18, 10)) zwiększyć pierwszą wartość figsize, co prawda jest to obejście w dużym stopniu zależne od ilości miejsca na ekranie, ale oprócz tego znalazłem tylko pl.axis('scaled'), pl.axis('tight'), pl.axis('auto'), pl.axis('equal'), możesz pokombinować z tymi parametrami. IMHO najlepiej wykres wygląda na tight ;)

BTW. ja sam dopiero do tego tematu zacząłem używać matplotlib, wcześniej znałem Python'a, może ktoś, kto korzystał z tego modułu na poważnie, będzie potrafił udzielić bardziej trafnej odpowiedzi ;)

1

Dziękuję, bardzo mi pomogłeś :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1