2016-07-26 14 views
2

bekommen Ich habe die Dokumentation gelesen und habe Google und StackOverflow nach Antworten gesucht, aber keiner der klüger noch.Den gewünschten Datetime-Wert von der x-Achse in Bokeh

Ich habe ein Bokeh-Diagramm mit Kreis-Glyphen für zwei Variablen 'Score' und 'Stress', und eine dritte Variable 'Datum' als Datetime X-Achse (Bild here). Ich möchte, dass die Benutzer in der Lage sind, auf die Kreise zu klicken und zu einer URL geführt werden, die eine detaillierte Ansicht des bestimmten Datenpunkts zeigt, der durch das entsprechende Datum identifiziert wird.

Ich habe ein Tap-Tool mit OpenURL-Callback aktiviert, das den Datetime-Wert am Ende der URL anfügt. Das Problem ist, dass nach dem Klicken auf einen Datenpunkt der übergebene Datetime-Wert nicht im gewünschten Format ist: '2016-07-20'. Was ich stattdessen bekomme, ist der folgende Wert: '1468969200000'. Also wird der Benutzer auf "url/1468969200000 /" anstelle von "url/2016-07-20 /" umgeleitet.

Gibt es eine Möglichkeit, das Format des Datumswerts zu ändern, der nach dem Klicken auf einen Datenpunkt übergeben wird?

Hier ist mein Code (ausgeführt in jupyter Notebook):

import datetime 
from bokeh.plotting import figure, output_notebook, show 
from bokeh.models import Range1d, OpenURL, TapTool, HoverTool, ColumnDataSource, DatetimeTickFormatter 

data = {'score': [4.33, 2.66, 4.66, 2.66, 2.66, 1.66, 1.0, 4.33], 
     'stress': [3.66, 3.0, 3.0, 1.33, 3.66, 3.33, 1.0, 4.33], 
     'date': [ 
      datetime.date(2016, 7, 17), 
      datetime.date(2016, 7, 18), 
      datetime.date(2016, 7, 19), 
      datetime.date(2016, 7, 20), 
      datetime.date(2016, 7, 21), 
      datetime.date(2016, 7, 22), 
      datetime.date(2016, 7, 23), 
      datetime.date(2016, 7, 24) 
     ] 
     } 

source = ColumnDataSource(data=data) 

TOOLS = ['hover', 'pan', 'tap'] 

plot = figure(x_axis_type='datetime', plot_height=250, tools=TOOLS) 

plot.circle('date', 'score', legend='score', size=15, color='red', source=source) 
plot.circle('date', 'stress', legend='stress', size=10, color='orange', source=source) 
plot.y_range = Range1d(1, 5, bounds=(1,5)) 
plot.x_range = Range1d(datetime.date(2016, 7, 17), datetime.date(2016, 7, 23)) 

hover = plot.select(type=HoverTool) 
hover.tooltips = [ 
    ("score", "@score"), 
    ("stress", "@stress"), 
    ("date", "@date") 
    ] 

url = 'url/@date/' 
taptool = plot.select(type=TapTool) 
taptool.callback = OpenURL(url=url) 

show(plot) 

Antwort

1

Eine einfache Abhilfe Datum im String-Format zusätzlich zu schaffen wäre.

dateStr= {'dateStr': [x.isoformat() for x in data['date']]} 
data.update(dateStr) 

dann können Sie dateStr in Ihrem hover.tooltips verwenden und die URL

hover.tooltips = [ 
    ("score", "@score"), 
    ("stress", "@stress"), 
    ("date", "@dateStr") 
    ] 

url = 'url/@dateStr/' 
+0

Danke für die Anregung zu erzeugen, @jlarsch! Das hat den Trick gemacht! –