Я показывал этот код коллеге, чтобы они могли воспроизвести его с другим набором данных, но, похоже, он больше не работает как задумано. Быстрый взгляд заставляет меня думать, что это как-то связано с тем, какие предметы видны или нет. Посмотрим повнимательнее позже.

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

Образец моих данных:

        year state statetotal ba_total
0     1984.0    AK      221.0    108.0
1     1985.0    AK      242.0    141.0
2     1984.0    NC      229.0    117.0
3     1985.0    NC      257.0    138.0
4     1984.0    MA      272.0    165.0
5     1985.0    MA      280.0    176.0
6     1984.0    NY      375.0    249.0
7     1985.0    NY      309.0    208.0

Это то, что я пробовал до сих пор:

for col in df.columns:
    df[col] = df[col].astype(str)

scl = [[0.0, 'rgb(242,240,247)'],[0.2, 'rgb(218,218,235)'],[0.4, 'rgb(188,189,220)'],\
            [0.6, 'rgb(158,154,200)'],[0.8, 'rgb(117,107,177)'],[1.0, 'rgb(84,39,143)']]

df['text'] = df['statename'] + '<br>' + \
    'Bachelor '+df['ba_total']+'<br>'+ \
    'Master '+df['ma_total']+'<br>'+ \
    'PhD '+df['phd_total']

# Years
years = list(df['year'].astype(float).astype(int).unique())

# make data
data = []

# Append data
for year in years:
    dataset_by_year = df[df['year'].astype(float).astype(int) == int(year)]

    data_dict = [ dict(
        type='choropleth',
        visible=True,
        colorscale = scl,
        autocolorscale = False,
        locations = dataset_by_year['state'],
        z = dataset_by_year['statetotal'].astype(float),
        locationmode = 'USA-states',
        text = dataset_by_year['text'],
        marker = dict(
            line = dict (
                color = 'rgb(255,255,255)',
                width = 2
            ) ),
        colorbar = dict(
            title = "Educ. Grads")
        ) ]
    data.append(data_dict[0])

# let's create the steps for the slider
steps = []
for i in range(len(data)):
    step = dict(method='restyle',
                args=['visible', [False] * len(data)],
                label='{}'.format(i + 1984))
    step['args'][1][i] = True
    steps.append(step)

sliders = [dict(active=0,
                pad={"t": 1},
                steps=steps)]    

# create the empty dropdown menu
updatemenus = list([dict(buttons=list()), 
                    dict(direction='down',
                         showactive=True)])

total_codes = len(df.state.unique()) + 1

for s, state in enumerate(df.state.unique()):
    # add a trace for each state
    data.append(dict(type='scatter',
                     x=[i for i in range(1984, 2016)],
                     y=[i for i in df.statetotal],
                     visible=False))

    # add each state to the dropdown    
    visible_traces = [False] * total_codes
    visible_traces[s + 1] = True
    updatemenus[0]['buttons'].append(dict(args=[{'visible': visible_traces}],
                                          label=state,
                                          method='update'))

# add a dropdown entry to reset the map    
updatemenus[0]['buttons'].append(dict(args=[{'visible': [True] + [False] *  (total_codes - 1)}],
                                      label='Map',
                                      method='update'))

layout = dict(title='Aggregated Number of Graduates in Education by State',
              updatemenus=updatemenus,
              geo=dict(scope='usa',
                       projection={'type': 'albers usa'}),
              sliders=sliders)

fig = dict(data=data, 
           layout=layout)

Я получаюAttributeError относящиеся к функции, которую я создал, но ранее мне удалось сгенерировать график с присутствующими меню, но график генерировал 50 кнопок меню, а не выпадающий список с 50 опциями.

Я думаю, что эти проблемы могут быть решены, но суть моих проблем заключается в том, возможно ли объединить типы графиков вместе? В идеале я хотел бы показать линейный график, если я нажму на Аляску, показывающую количество степеней бакалавра, завершенных за наблюдаемый период времени. Это возможно?

РЕДАКТИРОВАТЬ код

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

Ответы на вопрос(1)

Решение Вопроса

но все данные должны быть загружены при визуализации первого графика. Возможно, взгляните на Dash Plotly, который позволил динамическую загрузку данных.

Чтобы получить выпадающее меню, которое показывает следы, вы можете сделать следующее:

Сначала создайте карту, затем добавьте точечный график для каждой страны, но покажите карту только, установивvisible приписывать.Создатьвыпадающее меню который показывает график рассеяния для выбранной страны (передавая массив логическихvisible)Добавьте пункт меню, чтобы снова показать карту

import pandas as pd
import plotly

plotly.offline.init_notebook_mode()
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_us_ag_exports.csv')

# create the initial map
data = [dict(type='choropleth',
             locations = df['code'].astype(str),
             z=df['total exports'].astype(float),
             locationmode='USA-states', 
             visible=True)]

layout = dict(geo=dict(scope='usa',
                       projection={'type': 'albers usa'}))

# create the empty dropdown menu
updatemenus = list([dict(buttons=list()), 
                    dict(direction='down',
                         showactive=True)])

total_codes = len(df.code.unique()) + 1

for s, state in enumerate(df.code.unique()):
    # add a trace for each state
    data.append(dict(type='scatter',
                     x=[i for i in range(1980, 2016)],
                     y=[i + random.random() * 100 for i in range(1980, 2016)],
                     visible=False))

    # add each state to the dropdown    
    visible_traces = [False] * total_codes
    visible_traces[s + 1] = True
    updatemenus[0]['buttons'].append(dict(args=[{'visible': visible_traces}],
                                          label=state,
                                          method='update'))

# add a dropdown entry to reset the map    
updatemenus[0]['buttons'].append(dict(args=[{'visible': [True] + [False] *  (total_codes - 1)}],
                                      label='Map',
                                      method='update'))
layout['updatemenus'] = updatemenus

fig = dict(data=data, 
           layout=layout)
plotly.offline.iplot(fig)
 otteheng20 окт. 2017 г., 20:05
Это потрясающе! Можно ли объединить это с ползунком, чтобы ползунок отображался только с картой? (см. редактирование)
 Maximilian Peters21 окт. 2017 г., 13:27
@otteheng: Вероятно, да, вам нужно обновитьlayout для каждого выпадающего меню это, вероятно, становится немного грязным, но это должно работать.
 otteheng05 февр. 2018 г., 18:49
Я показывал этот код коллеге, чтобы они могли воспроизвести его с другим набором данных, но, похоже, он больше не работает как задумано. Быстрый взгляд заставляет меня думать, что это как-то связано с тем, какие предметы видны или нет. Посмотрим повнимательнее позже.
 otteheng25 окт. 2017 г., 16:30
Я думаю, у меня возникли проблемы, зная, где искатьlayout выключитьslider, Я могу отключитьslider для всего графика, но не для каждого раскрывающегося списка в отдельности.

Ваш ответ на вопрос