有没有办法强制图形的初始负载?

问题描述 投票:1回答:1

[使用Python /绘图,我正在尝试创建一个具有地图和滑块以选择年份的图形。减少在滑块中选择的年份,地图应呈现不同的结果。

[Evertyhing可以正常工作,但有一件事情例外,我无法将地图的初始加载状态设置为与在其中定义的初始步骤相同

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

[当完成第一个渲染并且尚未使用滑块时,显示的数据似乎对应于data_slider列表的最后状态,即。它显示了列表中最后加载的值(我不太确定这个结论)。

是否可以根据预定义的步骤设置第一个数据显示?或者,也可以采用一种方法来将首次加载强制为data_slider[0]

下面是我正在使用的代码。

import pandas as pd
import os
import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objects as go
import numpy as np
import random

ds = 'https://archive.org/download/globalterrorismdb_0718dist/globalterrorismdb_0718dist.csv'
# ds = os.getcwd() + '\globalterrorismdb_0718dist.csv'

fields = ['eventid', 'iyear', 'country', 'country_txt', 'region_txt', 'city', 'latitude', 'longitude', 'nkill']

df = pd.read_csv(ds, encoding='ISO-8859-1', usecols=fields)

df = df.loc[df['iyear'] >= 2000]

df['nkill'].fillna(0, inplace=True)

df = df.groupby(['country_txt', 'iyear'])['nkill'].sum().reset_index()
df = df.loc[df['nkill'] > 0]

data_slider = []

for year in df.iyear.unique():
    df_year = df[(df['iyear'] == year)]

    data_year = dict(
        type='choropleth',
        name='',
        colorscale='amp',
        locations=df_year['country_txt'],
        z=df_year['nkill'],
        zmax=15000,
        zmin=0,
        locationmode='country names',
        colorbar=dict(
            len=0.5,
            thickness=10,
            title=dict(
                text='Number of fatalities',
                font=dict(
                    family='Arial',
                    size=14,
                ),
                side='right'
            ),
            tickfont=dict(
                family='Arial',
                size=12),
        )
    )

    data_slider.append(data_year)

steps = []

for i in range(len(data_slider)):
    step = dict(
        method='restyle',
        args=['visible', [False] * len(data_slider)],
        label=(format(i + 2000))
    )

    step['args'][1][i] = True
    steps.append(step)

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

layout = dict(
    geo=dict(
        scope='world',
        showcountries=True,
        projection=dict(
            type='equirectangular'
        ),
        showland=True,
        landcolor='rgb(255, 255, 255)',
        showlakes=False,
        showrivers=False,
        showocean=True,
        oceancolor='white',
    ),
    sliders=sliders
)

fig = go.Figure(data=data_slider, layout=layout)

fig.update_layout(
    font=dict(family='Arial', size=12),
    autosize=False,
    width=1250,
    height=750,
    margin=dict(
        l=25,
        r=0,
        b=100,
        t=50,
        pad=0,
    )
)

app = dash.Dash(__name__)
server = app.server

app.layout = html.Div(children=[
    # html.H1(children='Test2'),

    # html.Div(children='''
    #     Example of html Container
    # '''),

    dcc.Graph(
        id='fig',
        figure=fig
    )
])

if __name__ == '__main__':
    app.run_server(debug=True)
python plotly
1个回答
0
投票

这里的问题不在sliders上,而是在data_slider中定义的迹线上。您需要使用visible参数才能正确渲染第一个图。以下技巧应该起作用。

data_slider = []

for i, year in enumerate(df.iyear.unique()):
    df_year = df[(df['iyear'] == year)]

    data_year = dict(
        type='choropleth',
        name='',
        colorscale='amp',
        locations=df_year['country_txt'],
        z=df_year['nkill'],
        zmax=15000,
        zmin=0,
        locationmode='country names',
        visible= True if i==0 else False,
        colorbar=dict(
            len=0.5,
            thickness=10,
            title=dict(
                text='Number of fatalities',
                font=dict(
                    family='Arial',
                    size=14,
                ),
                side='right'
            ),
            tickfont=dict(
                family='Arial',
                size=12),
        )
    )

    data_slider.append(data_year)

额外

鉴于您正在生成app以外的所有绘图,您实际上可以避免使用dash

© www.soinside.com 2019 - 2024. All rights reserved.