2015-11-23 9 views
15

Używam bokeh z notatnikiem do ipythona.Jak ustawić oś X jako serwery czasu na wykresie bokeh?

Chcę wykreślić wykres liniowy w bokeh użyciu DataFrame pandy zawierający datetimes:

import pandas as pd 
from datetime import datetime as dt 
from bokeh.io import output_notebook 
from bokeh.charts import Bar, Line, show 

df = pd.DataFrame(data=[1,2,3], 
        index=[dt(2015, 1, 1), dt(2015, 1, 2), dt(2015, 1, 3)], 
        columns=['foo']) 

output_notebook() 
show(Line(df)) 

Jednak bokeh używa mikrosekund! Dlaczego to? Jak mogę to naprawić?

bokeh plot of line

Odpowiedz

21

jest ok?

enter image description here

import pandas as pd 
from math import pi 
from datetime import datetime as dt 
from bokeh.io import output_file 
from bokeh.charts import show 
from bokeh.models import DatetimeTickFormatter 
from bokeh.plotting import figure 

df = pd.DataFrame(data=[1,2,3], 
        index=[dt(2015, 1, 1), dt(2015, 1, 2), dt(2015, 1, 3)], 
        columns=['foo']) 
p = figure(plot_width=400, plot_height=400) 
p.line(df.index, df['foo']) 
p.xaxis.formatter=DatetimeTickFormatter(
     hours=["%d %B %Y"], 
     days=["%d %B %Y"], 
     months=["%d %B %Y"], 
     years=["%d %B %Y"], 
    ) 
p.xaxis.major_label_orientation = pi/4 
output_file('myplot.html') 
show(p) 
+0

Jak przychodzi swoją oś X pokazuje wykres 1 stycznia dwa razy, a następnie 2, a 3 stycznia? – multigoodverse

+0

@ A.S to b/c wszystkie możliwe rozdzielczości czasowe mają ten sam formater. Chaning tych, które mają być bardziej skalowalne, powinien zadziałać. –

+0

To działa całkiem dobrze, dzięki. Ale zastanawiam się, czy musimy zdefiniować format dla wszystkich różnych przedziałów czasowych (godzina, dzień, miesiąc, rok)? Masz jakiś pomysł? – Brandt

1

FWIW, domyślne zachowanie się zmieniło, ponieważ kwestia została opublikowana po raz pierwszy. Oryginalny kod teraz daje:

outcome from code

20

Od bokeh 0.12.3, można teraz zrobić:

p = figure(..., x_axis_type='datetime', ...) 
+1

Ktoś w SO proszę przesunąć tę odpowiedź w górę! Musi istnieć sposób na podniesienie odpowiedzi, które są bardziej istotne po poważnej rewizji jakiegoś fragmentu kodu! Przeniesię mój rant na metę :) – famargar

Powiązane problemy