Python 将下拉菜单添加到Choropleth映射以选择每个状态并生成新的图形类型
我已经创建了一个Choropleth地图,我想知道是否可以为每个州添加一个下拉列表。当您选择下拉列表时,图形将变为该状态下随时间获得的学士学位数的折线图 我的数据示例:Python 将下拉菜单添加到Choropleth映射以选择每个状态并生成新的图形类型,python,plotly,choropleth,Python,Plotly,Choropleth,我已经创建了一个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 198
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)
对于df.列中的列:
df[col]=df[col].astype(str)
scl=[[0.0,'rgb(242240247)”,[0.2,'rgb(218235)”,[0.4,'rgb(188189220)”\
[0.6,'rgb(158154200)”,[0.8,'rgb(117107177)”,[1.0,'rgb(84,39143)]]
df['text']=df['statename']+'
'+\
“学士学位”+df['ba_total']+'
'+\
“Master”+df['ma_total']+'
'+\
“博士”+df[“博士总数”]
#年头
年份=列表(df['year'].astype(float).astype(int).unique()
#制作数据
数据=[]
#附加数据
年份:
dataset_by_year=df[df['year'].astype(float).astype(int)=int(year)]
数据dict=[dict(
type='choropleth',
可见=真,
色标=scl,
自动颜色比例=假,
位置=数据集按年份[“状态”],
z=数据集按年份['statetotal']划分。aType(浮点),
locationmode=‘美国各州’,
text=数据集按年份['text'],
记号笔(
行=dict(
颜色='rgb(255255)',
宽度=2
) ),
色条(
title=“教育毕业生”)
) ]
data.append(数据目录[0])
#让我们为滑块创建步骤
步骤=[]
对于范围内的i(len(数据)):
步骤=dict(方法='restyle',
args=['visible',[False]*len(数据)],
label='{}'。格式(i+1984))
步骤['args'][1][i]=True
步骤。追加(步骤)
滑块=[dict(活动=0,
pad={“t”:1},
步骤=步骤]
#创建空的下拉菜单
updatemenus=list([dict(按钮=list()),
dict(方向为向下),
showactive=True)])
代码总数=len(df.state.unique())+1
对于s,枚举中的状态(df.state.unique()):
#为每个状态添加跟踪
data.append(dict(type='scatter',
x=[i代表范围内的i(1984年、2016年)],
y=[i代表df.stateT总计中的i],
可见=假)
#将每个状态添加到下拉列表中
可见\u跟踪=[False]*总\u代码
可见_道[s+1]=真
updatemenus[0]['buttons'].append(dict(args=[{'visible':visible_traces}],
标签=状态,
方法(='update'))
#添加下拉项以重置地图
updatemenus[0]['buttons'].append(dict(args=[{'visible':[True]+[False]*(总代码-1)}),
label='Map',
方法(='update'))
布局=dict(标题=‘各州教育毕业生总数’,
updatemenus=updatemenus,
geo=dict(范围=美国),
投影={'type':'albers usa'}),
滑块=滑块)
图=dict(数据=数据,
布局=布局)
我得到了一个与我创建的函数相关的AttributeError
,但之前我成功生成了包含菜单的图形,但图形生成了50个菜单按钮,而不是包含50个选项的下拉列表
我认为这些问题是可以解决的,但我的问题的关键是是否有可能将图形类型组合在一起?理想情况下,如果我点击阿拉斯加,我想显示一个折线图,显示在观察期间完成的学士学位数量。
这可能吗
编辑代码
我设法让下拉菜单工作,但它不配合和地图很好。我不知道当您单击下拉菜单中的某个项目时,如何使滑块消失,或者如何防止贴图覆盖在折线图的顶部 通过Plotly online可以获得所需的功能,但在渲染第一个图形时需要加载所有数据。也许可以看看Plotly的破折号,它支持动态加载数据 要获得显示轨迹的下拉菜单,可以执行以下操作:
- 首先创建地图,然后为每个国家添加散点图,但仅通过设置
可见属性来显示地图
- 创建显示所选国家/地区散点图的散点图(通过将布尔值数组传递给可见的
) - 添加菜单项以再次显示地图
这太棒了!您是否可以将其与滑块组合,使滑块仅与贴图一起显示?(请参见编辑)@otteheng:可能是的,您还需要为每个下拉菜单更新
布局,它可能会有点混乱,但应该可以工作。我想我不知道在布局中查找以关闭滑块
。我可以对整个图形禁用滑块
,但不能对每个下拉菜单单独禁用。我向同事展示了此代码,以便他们可以用另一个数据集复制此代码,但它似乎不再按预期工作。快速的一瞥让我觉得这与哪些项目可见或不可见有关。稍后将更仔细地查看。
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)