2017-10-16 17 views
1

Je recréer le example choropleth et essayer d'ajouter un curseur qui, une fois déplacé, changerait d'année en année. Un autre utilisateur a demandé un similar question mais n'a pas reçu de réponse. J'ai fait un peu plus de recherche et trouvé un example où l'utilisateur a généré des valeurs aléatoires pour les années supplémentaires et a créé un curseur, mais il est en JavaScript et je ne sais pas comment le traduire en Python.Comment créer une carte choropleth avec un curseur en utilisant Plotly?

Voici le code JavaScript:

Plotly.d3.csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_us_ag_exports.csv', function(err, rows){ 
    function unpack(rows, key) { 
    return rows.map(function(row) { return row[key]; }); 
    } 

    var randomize = z => z.map(d => Math.pow(Math.random(), 2) * 30000); 
    var data = unpack(rows, 'total exports'); 
    var frames = [{ 
    data: [{z: unpack(rows, 'total exports')}], 
    traces: [0], 
    name: '1990', 
    layout: {title: '1990 US Agriculture Exports by State'} 
    }, { 
    data: [{z: randomize(data)}], 
    traces: [0], 
    name: '1995', 
    layout: {title: '1995 US Agriculture Exports by State'} 
    }, { 
    data: [{z: randomize(data)}], 
    traces: [0], 
    name: '2000', 
    layout: {title: '2000 US Agriculture Exports by State'} 
    }, { 
    data: [{z: randomize(data)}], 
    traces: [0], 
    name: '2005', 
    layout: {title: '2005 US Agriculture Exports by State'} 
    }] 

    var data = [{ 
    type: 'choropleth', 
    locationmode: 'USA-states', 
    locations: unpack(rows, 'code'), 
    z: unpack(rows, 'total exports'), 
    text: unpack(rows, 'state'), 
    zmin: 0, 
    zmax: 17000, 
    colorscale: [ 
     [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, 'rgb(84,39,143)'] 
    ], 
    colorbar: { 
     title: 'Millions USD', 
     thickness: 0.2 
    }, 
    marker: { 
     line:{ 
     color: 'rgb(255,255,255)', 
     width: 2 
     } 
    } 
    }]; 


    var layout = { 
    title: '1990 US Agriculture Exports by State', 
    geo:{ 
     scope: 'usa', 
     showlakes: true, 
     lakecolor: 'rgb(255,255,255)' 
    }, 
    xaxis: {autorange: false}, 
    yaxis: {autorange: false}, 
    sliders: [{ 
     currentvalue: { 
     prefix: 'Year: ', 
     }, 
     steps: frames.map(f => ({ 
     label: f.name, 
     method: 'animate', 
     args: [[f.name], {frame: {duration: 0}}] 
     })) 
    }] 
    }; 

    Plotly.plot('graph', { 
    data: data, 
    layout: layout, 
    frames: frames, 
    config: {showLink: false} 
    }); 
}); 

Est-il possible de le faire en Python?

Répondre

5

Le code ci-dessous est pratiquement une version réduite du choropleth example pour Python et du code sliders.

Les données aléatoires sont créées en fonction des premières données et chaque entrée de curseur affiche une partie différente de la liste de données.

import pandas as pd 
import plotly 
import numpy as np 

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

data = [dict(type='choropleth', 
      locations = df['code'].astype(str), 
      z=df['total exports'].astype(float), 
      locationmode='USA-states')] 

# let's create some additional, random data 
for i in range(5): 
    data.append(data[0].copy()) 
    data[-1]['z'] = data[0]['z'] * np.random.rand(*data[0]['z'].shape) 

# 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='Year {}'.format(i + 1980)) 
    step['args'][1][i] = True 
    steps.append(step) 

sliders = [dict(active=0, 
       pad={"t": 1}, 
       steps=steps)]  
layout = dict(geo=dict(scope='usa', 
         projection={'type': 'albers usa'}), 
       sliders=sliders) 

fig = dict(data=data, 
      layout=layout) 
plotly.offline.iplot(fig) 

enter image description here

+0

C'est génial! Je vous remercie. Une petite question esthétique. Comment changeriez-vous le slider pour dire "Année: 1980" à la place de "step-0" et avez les étapes marquées jusqu'à l'année 1990? – otteheng

+0

ajoute 'label = 'Année {}'. Format (i + 1980)' à 'step'' dict', voir mise à jour de la réponse. –

+0

Cela fonctionne. Une petite erreur dans votre code. Les crochets doivent entourer 'args = ['visible', [False] * len (data)]'. – otteheng