Обновление географической визуализации в Bokeh по событию нажатия кнопки - PullRequest
0 голосов
/ 23 мая 2018

Я очень новичок в библиотеке визуализации Bokeh в Python.Я построил визуализацию географической карты с помощью Bokeh и API Карт Google, которая позволяет мне видеть распределение моих данных для определенного местоположения (города) в США.Далее я разложил эти данные по полу (используя разные цвета для каждого пола в моем наборе данных, мужской, женский и неизвестный).То, что я сейчас собираюсь сделать, это визуализировать событие нажатия кнопки.Изучив различную документацию в Bokeh, исследуя переполнение стека и другие подобные сайты, я до сих пор придумал следующий код:

from bokeh.plotting import figure, output_file, show
from bokeh.models import *
from bokeh.plotting import gmap
from bokeh.io import output_notebook, curdoc
from bokeh.transform import factor_cmap
from bokeh.models.widgets import Panel, Tabs
from bokeh.events import ButtonClick
from bokeh.models import Button
from bokeh.layouts import column
from bokeh.events import ButtonClick

import pandas as pd
import numpy as np
import pyodbc

output_file("gmap.html")

#parameters
server = 'x.x.x.x\abc'
db = 'abc'

# Create the connection
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + server + ';DATABASE=' + db + ';Trusted_Connection=yes')
map_options = GMapOptions(lat=37.686293, lng=-97.3614409, map_type="roadmap", zoom=13)
p = gmap("My_Google_Maps_API_Key", map_options, title="Client_Distribution", plot_width=1000, plot_height=600)


def callback(event):
    print ('abc')
    global p, map_options
    sql = """
        with CTE AS
            (SELECT
            CR.ClientID, CR.Latitude, CR.Longtitude
            FROM 
            Company C LEFT JOIN ClientRegistration CR on C.CompanyID = CR.CompanyID
            WHERE
            C.CompanyID = xxx AND (CR.Latitude IS NOT NULL AND CR.Longtitude IS NOT NULL)
            )
        SELECT
        C.ClientID, C.Latitude, C.Longtitude, CL.Sex
        FROM
        CTE C LEFT JOIN Clients CL on C.ClientID = CL.ClientID
    """
    df = pd.read_sql(sql, conn)

    print (df)

    df[['Latitude','Longtitude']] = df[['Latitude','Longtitude']].apply(pd.to_numeric)
    df['Sex'] = df['Sex'].astype('str')

    map_options = GMapOptions(lat=37.686293, lng=-97.3614409, map_type="roadmap", zoom=13)
    p = gmap("My_Google_Maps_API_Key", map_options, title="Client_Distribution", plot_width = 1000, plot_height = 600)

    lat = df['Latitude'].tolist()
    lon = df['Longtitude'].tolist()
    sex = df['Sex'].tolist()

    source = ColumnDataSource(
    data=dict(latitude = lat,
              longitude = lon,
              gender = sex
               )
    )

    print (source)
    color_mapper = CategoricalColorMapper(factors=['M', 'F', 'U'], palette=['Red', 'Blue', 'Green'])

    print("reached end")

    p.circle(x="longitude", y="latitude", size=4, fill_alpha=0.9, source=source,
             fill_color={'field': 'gender', 'transform': color_mapper},
             line_color={'field': 'gender', 'transform': color_mapper})

    x = np.linspace(0, 4 * np.pi, 100)
    y = np.sin(x)

    p.circle(x, y, legend="Male", color="red")
    p.circle(x, 2 * y, legend="Female", color="Blue")
    p.circle(x, 3 * y, legend="Unknown", color="Green")

    curdoc().clear()
    curdoc().add_root(column(p))


    print("reached the very end")



# add a button widget and configure with the call back
button = Button(label="Gender")
button.on_event(ButtonClick, callback)

# put the button and plot in a layout and add to the document

curdoc().add_root(column(button, p))

Я могу получить базовую визуализацию карты Google и кнопку для отображения, но я не могу отобразить факторизацию клиентов по полу и маркировку этих точек данных нажатием кнопки.Когда я нажимаю кнопку, с моей картой ничего не происходит.Может кто-нибудь сообщить мне, что я делаю не так?

Спасибо!

...