2017-03-09 2 views
1

die Datenzeilen wie folgt aussieht:Bokeh Liniendiagramm mit Datenmarkierungen von Postgres DB

date name val 
2017-02-05 a 600.0 
2017-02-05 b 345.0 
2017-02-05 c 679.0 
2017-02-05 d 0.0 
2017-02-05 e 66.0 
2017-02-05 f 0.0 
2017-02-05 g 156.0 
2017-03-05 a 634.0 
2017-03-05 b 0.0 
2017-03-05 c 2679.0 
2017-03-05 d 0.0 
2017-03-05 e 9266.0 
2017-03-05 f 0.0 
2017-03-05 g 56.0 

Ich mag würde ein Liniendiagramm mit Datenmarkierungen zu erzeugen. x wäre date, y wäre val und die Legendenfarbe wäre gruppiert nach "name"

Ich habe einen Code wie unten geschrieben, aber er zeigt mir eine leere Seite. Es scheint, als würde etwas schief gehen. Ich bin mir auch nicht sicher, wie man Datenmarker hinzufügt. gesucht aus dem Internet und scheint wie sollte ein Liniendiagramm und ein Kreisdiagramm zusammenführen, um es zu erledigen.

Könnte jemand bitte helfen, den Fehler zu beheben und mir zeigen, wie das geht?

from bokeh.charts import Line, show, output_file, TimeSeries,Scatter 
from bokeh.plotting import figure 
from bokeh.models import HoverTool 
import sqlalchemy as sa 
import pandas as pd 


# database credentials 
usr = 'test' 
pswd = 'test' 
db = 'test' 


# create the connection to the database 
engine = sa.create_engine(
    'postgresql://{0}:{2}@localhost:3552/{1}' \ 
    .format(usr,db,pswd) 
) 


query = "select date::text,name,round(size/1024/1024/1024) as val from test order by 1,2" 

# extract the data 
df = pd.read_sql_query(query, engine) 

output_file("example_chart.html") 

# create a line chart where each column of measures receives a unique color and dash style 
plot = figure(title="Example of a line chart", x_axis_label='Date', y_axis_label='size in GB') 

plot.line(x=df['date'], y=df['val'], color=df['name']) 

show (plot) 

Antwort

0

Aus der Tatsache, dass Sie die Farbe aus dem df lesen, zeigt mir, dass Sie mehrere Zeilen plotten möchten. Wenn dies der Fall ist, sollten Sie multi_line anstelle von line verwenden. Siehe http://bokeh.pydata.org/en/latest/docs/user_guide/plotting.html#multiple-lines

plot.multi_line(xs=df['date'], ys=df['val'], color=df['name']) 

aktualisieren

Erstellen einige Daten:

import pandas as pd 
import numpy as np 
data = np.array([pd.DatetimeIndex(['2017-02-05']*7+['2017-03-05']*7), 
["red","green","blue","orange","black","yellow","purple"]*2, 
[600.0,345.0,679.0,0.0,66.0,0.0,156.0,634.0,0.0,2679.0,0.0,9266.0,0.0,56.0]]) 
df = pd.DataFrame(data=data.T,columns = ["date","name","val"]) 

die wie folgt aussieht:

enter image description here

ich mich verändert habe den Spaltennamen zu tatsächliche Farben. Dann müssen Sie Ihre Daten, um neu zu ordnen multi_line zu verwenden:

import bokeh 
import bokeh.plotting 

p = bokeh.plotting.figure(plot_width=300,plot_height=300, x_axis_type="datetime") 
dates = [df[df.name.isin([x])].date for x in df.name.unique()] 
vals = [df[df.name.isin([x])].val for x in df.name.unique()] 
p.multi_line(xs=dates,ys=vals, color = df.name.unique()) 

bokeh.io.output_file("example_chart.html") 
bokeh.io.show(p) 

Die Ausgabe sieht so aus:

enter image description here

+0

Hallo Pablo, noch leeres Diagramm. – fairybetty

+0

Das würde mir helfen, Ihnen und wahrscheinlich sich selbst vor: http://stackoverflow.com/help/mcve –

+0

Hallo Pablo, ich ersetzte die ursprüngliche Zeile "plot.line" mit der "multi_line" -Funktion, die Sie empfohlen haben. Die Python-Datei kann ohne Fehler ausgeführt werden. Die geöffnete HTML-Seite ist jedoch leer. Es hat den Titel der Handlung und die graue Box, darin sollte Liniendiagramm haben, aber es ist leer. – fairybetty

0

Da ich nicht Pablos Antwort kommentieren kann, ich meine ich das Hinzufügen basierend auf seine Antwort. Es war auch leer für mich und das Problem kam aus dem Zeitstempel, müssen Sie sicherstellen, dass Sie DatetimeIndex in Daten Affektation verwenden.

Hier mein Code Auszug aus meiner Klasse ist (ich Codierung nicht gut bin, so Bemerkungen sind willkommen), die Daten von postgresql nimmt und plotten es:

def getColumn(self, column): 
    self.logger.info('Getting ' + column +' from DB...') 
    self.cur.execute("SELECT " + column + " FROM history") 

    return [i[0] for i in self.cur.fetchall()] 

def multiAccountsPlot(self): 

    #I sort the blank issue by making sure the dates format was the same as Pablo's sample 
    data = np.array([pd.DatetimeIndex([i.isoformat() for i in self.getColumn("timestamp")]), 
     self.getColumn("account"), 
     self.getColumn("amount")]) 
    df = pd.DataFrame(data=data.T,columns = ["date","account","amount"]) 

    p = bokeh.plotting.figure(width=800, height=350, x_axis_type="datetime") 
    dates = [df[df.account.isin([x])].date for x in df.account.unique()] 
    vals = [df[df.account.isin([x])].amount for x in df.account.unique()] 

    mypalette=Spectral11[0:len(df.account.unique())] 
    p.multi_line(xs=dates,ys=vals, line_color=mypalette) 

    bokeh.io.output_file("example_chart.html") 
    bokeh.io.show(p) 

Dank Pablo für Ihre Antwort, es hat mir geholfen viel

Verwandte Themen