Использование всплывающей подсказки bqplot с фреймом данных

Используйте виджет для отображения фрагментов из файла / фрейма данных csv и передачи в атрибут всплывающей подсказки bqplot

Я пытаюсь отобразить определенную информацию (такую ​​статистику, как возрастная группа, доход, уровни ожирения и т. Д.) Для каждого штата в США, используя bqplot. Я могу построить карту США, используя примеры, представленные на github bqplot. Но конструктор всплывающей подсказки использует имена столбцов из файла json, который также используется для фактического отображения карты. Я не знаю, как это переопределить, поэтому я решил использовать виджет (в идеале виджет-контейнер) для хранения данных, которые я хочу отображать для каждого состояния, и использовать метод on_hover (), предоставленный в bqplot.map; Фактически, я просто изменил код по ссылке ниже:

Контейнер как всплывающая подсказка не отображает содержимое

для отображения информации о конкретном состоянии


import bqplot
import pandas as pd
import ipywidgets as ipw
from IPython.display import display, clear_output

res = pd.read_csv('data_files/clean_data.csv')
df = pd.DataFrame(res)

## using values for only one state
df_temp = df[df['State'] == 'NY']

out = ipw.Output()
def hover_handler(self,Dataframe):
        out.clear_output()
        with out:

            display(ipw.HTML(df_temp.to_html()))


geo = AlbersUSA()
scale_s =  OrdinalColorScale(domain=['Obese', 'Not Obese'], colors=['Red', 'Green'])
st_green = dict(zip(df['State'], list(obesity_list)))

geo = AlbersUSA()
scale_s =  OrdinalColorScale(domain=['Obese', 'Not Obese'], colors=['Red', 'Green'])
map_args = {'color': st_green,
              'scales': {'projection': geo, 'color': scale_s}, 
              'colors': {'default_color': 'Black'}}   

s_map = plt.geo(map_data='USStatesMap', **map_args)
s_map.toolip = out  # I am pointing tooltip to the out object
s_map.on_hover(hover_handler)
s_map
  1. Я не могу понять, как изменить цвет в каждом состоянии на основе значений «Ожирение» и «Нет ожирения»;

  2. Я использовал фрагменты кода из примера bqplot и приведенную выше ссылку на stackoverflow, но я не знаю, как изменить информацию при наведении курсора на другое состояние; В настоящее время df_temp содержит значения только для одного состояния и отображается везде, где я наведен на карту. Как я могу заставить виджет получать релевантные данные?

2.1 По сути, он мне нужен для отображения результатов в табличном формате:

State:NY
Status: Not Obese
Age_group | Obese | Not_obese
<18       |  %    |  %
19-30     |  %    |  %

У меня есть данные для всех полей выше в виде столбцов в кадре данных для КАЖДОГО состояния. Я новичок в ipywidgets и bqplot. Так что любая помощь будет принята с благодарностью.

Спасибо!


person DolphinB    schedule 08.10.2019    source источник


Ответы (1)


Для пункта 2:

В вашем hover_handler коде вам необходимо зафиксировать информацию, передаваемую в функцию, и использовать ее для фильтрации основного фрейма данных (df). Попробуйте изменить свой hover_handler код на приведенный ниже и посмотрите, какая информация передается в функцию. Затем подумайте, как использовать эту информацию, чтобы отфильтровать фрейм данных только до соответствующего состояния.

    def hover_handler(map, hover_event):
            out.clear_output()
            with out:
                print(hover_event)
person ac24    schedule 08.10.2019
comment
Спасибо! Когда вы говорите, что мне нужно захватить информацию, передаваемую функции, вы имеете в виду идентификатор состояния или указатель мыши? Я не знаю, как это сделать; функция geo использует данные USStatesMap для рисования карты И отображения информации. Это файл в формате json. Если я могу динамически (то есть при наведении) захватить идентификатор состояния, я могу отфильтровать свой df / dict и отобразить правильную информацию. Есть предложения по этому поводу? - person DolphinB; 08.10.2019
comment
Я немного изменил свой код. Это не должно включать в себя изменение функции geo. Когда вы устанавливаете s_map.on_hover(hover_handler), карта и событие наведения передаются в функцию hover_handler. hover_event dict скажет вам, над каким элементом вы навели курсор. Используйте эту информацию для анализа ваших входных данных и отображения нужного фрейма данных / диаграммы в виджете вывода. - person ac24; 08.10.2019
comment
Спасибо! Это очень помогло. Я немного поправил код. Однако я не уверен, что использую правильный атрибут для hover_event: - person DolphinB; 08.10.2019
comment
Извините, я не могу правильно отформатировать в разделе комментариев. Я использовал атрибут hover_highlight, который является логическим, и его значение по умолчанию - True, так что это не очень помогает. - person DolphinB; 08.10.2019
comment
bqplot. readthedocs.io/en/latest/_generate/ - person DolphinB; 08.10.2019
comment
`out = ipw.Output ()` `states_map = Map (map_data = topo_load ('map_data / USStatesMap.json'), scale = {'projection': sc_geo}, tooltip = out) states_map.interactions = {'click': 'select', 'hover': 'tooltip'} `def hover_handler(Map,states_map): out.clear_output() df_disp = pd.DataFrame() curr_st = states_map.hover_highlight print(curr_st) df_disp = df_US[df_US['id'] == curr_st] print(df_disp) with out: display(ipw.HTML(df_disp.to_html())) state_map.on_hover(hover_handler) - person DolphinB; 08.10.2019
comment
Я смог понять это! bqplot использует собственный вложенный словарь для получения данных при наведении указателя. У него нет атрибута (или его нет), к которому я могу получить доступ для фильтрации своего набора данных. Спасибо за ваш вклад! Это поможет мне в будущих проектах! - person DolphinB; 09.10.2019