Использование ползунка для обновления диаграммы p ie (боке) путем фильтрации данных - PullRequest
0 голосов
/ 02 августа 2020

Я новичок в этом и ценю любые указатели / помощь sh меня в правильном направлении. В основном я пытаюсь создать интерактивную диаграмму Bokeh p ie с ползунком, который может помочь соответствующим образом фильтровать данные (в данном случае год). Диаграмма p ie показывает долю лиц 65 лет и старше в рабочей силе, конечная цель - иметь возможность использовать ползунок, чтобы увидеть, как эта доля увеличивается с годами. Заранее всем большое спасибо.

https://data.gov.sg/dataset/total-residents-aged-15-years-and-over-by-labour-force-status-and-age-group-june-annual?resource_id=6549bb00-6ae8-4608-ab6a-1613b1121266

from math import pi

from bokeh.io import output_file, show
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Slider
from bokeh.plotting import figure
from bokeh.application.handlers import FunctionHandler
from bokeh.palettes import Category20b
from bokeh.transform import cumsum
from bokeh.application import Application

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
pd.options.mode.chained_assignment = None 

output_file("pie.html")

df1 = pd.read_csv('data CA2/total-residents-aged-15-years-and-over-by-age-group.csv',na_values =["na"])

rows_to_keep = ["65 Years & Over"]
rows_to_keep2 = ["Total Residents In The Labour Force", "Total Residents Outside The Labour Force"]
df2 = df1[df1['level_2'].isin(rows_to_keep)]
df3 = df2[df2["level_1"].isin(rows_to_keep2)] 


df4 = df3.groupby(['year', 'level_1', ]).sum()

df5 = df4.reset_index(drop=False)
df6 = df5[df5["year"] == 2019]

df6['angle'] = df6['value']/df6['value'].sum() * 2*pi
df6['color'] = ["purple","blue"]


p = figure(plot_height=350, title="Pie Chart", toolbar_location=None,
            tools="hover", tooltips="@level_1: @value",x_range=(-0.5, 1.0))

p.wedge(x=0, y=1, radius=0.4,
        start_angle= cumsum("angle", include_zero=True), end_angle=cumsum("angle"),
        line_color="white", fill_color='color', source=df6)

slider = Slider(start=1990, end=2019, value=2001, step=1, title="Year")


def update(source=df6, slider=slider, window=None):
    df6 = df5[df5["year"] == slider.value]
    source.trigger('change')

Выход тока p ie диаграмма:

Выход тока p ie график

1 Ответ

0 голосов
/ 04 августа 2020

Если вы хотите взаимодействия, вам нужно либо указать обратные вызовы в java с помощью обратных вызовов js_ *, либо, как в моем примере ниже, использовать чистые обратные вызовы python, но они не будут работать в обычном браузере без их размещения. на сервере боке, поскольку обычный html не поддерживает python. Я был именно там, где вы сейчас, см. Свой вопрос ( Экспорт интерактивных графиков Боке с виджетами в автономные HTML) и ответ.

Чтобы увидеть, как это работает, я используйте блокнот Jupyter для запуска кода и разработки взаимодействий. Я обнаружил, что это самый удобный способ создания приложений с эффектом боке, но вы также можете использовать его.

Чтобы заставить его работать в блокноте jupyter:

from bokeh.io import output_notebook
output_notebook()

Вам понадобится чтобы обернуть ваш код в одну функцию, которую вы затем передаете в FunctionHandler, а затем в функцию Application, которую вы затем можете показать.

df1 = pd.read_csv('total-residents-aged-15-years-and-over-by-age-group.csv',na_values =["na"])

rows_to_keep = ["65 Years & Over"]
rows_to_keep2 = ["Total Residents In The Labour Force", "Total Residents Outside The Labour Force"]
df2 = df1[df1['level_2'].isin(rows_to_keep)]
df3 = df2[df2["level_1"].isin(rows_to_keep2)] 


df4 = df3.groupby(['year', 'level_1', ]).sum()

df5 = df4.reset_index(drop=False)


def viz(doc):

    def update(attr,old,new):        
        df6 = grabData(new)
        src.data.update(ColumnDataSource(df6).data)

    def grabData(year):
        df6 = df5[df5["year"] == year]

        df6['angle'] = df6['value']/df6['value'].sum() * 2*pi
        df6['angle1'] = [0,df6['angle'].iloc[0]]
        df6['angle2'] = [df6['angle'].iloc[0],2*pi]
        df6['color'] = ["purple","blue"]
        return df6

    df6 = grabData(2001)
    src = ColumnDataSource(df6)

    p = figure(plot_height=350, title="Pie Chart", toolbar_location=None,
                tools="hover", tooltips="@level_1: @value",x_range=(-0.5, 1.0))

    p.wedge(source=src,x=0, y=1, radius=0.4,
            start_angle= 'angle1', end_angle='angle2',
            line_color="white", fill_color='color')

    slider = Slider(start=1990, end=2019, value=2001, step=1, title="Year")
    slider.on_change('value',update)
    doc.add_root(column(p,slider))




show(Application(FunctionHandler(viz)))
...