Package: easyplotly
Easy PlotlyStarThis is on-going research on how ploting withPlotly.py,
especially ploting of hierarchical data, could be made easier.See the outputs of the commands below - tables and plots -
in theHTML exportof this notebook.
Or even, open thisREADME.mdas a notebook and run it interactively onBinder!InstallationInstall theeasyplotlypython package withpip install easyplotlySample dataOur sample data is the population and life expectancy, per country and region:importworld_bank_dataaswbimportitables.interactive# Collect countriescountries=wb.get_countries()region_country=countries[['region','name']].rename(columns={'name':'country'})# Population & life expectancyregion_country['population']=wb.get_series('SP.POP.TOTL',mrv=1,id_or_value='id',simplify_index=True)region_country['life_expectancy']=wb.get_series('SP.DYN.LE00.IN',mrv=1,id_or_value='id',simplify_index=True)# Observations restricted to the countriespop_and_exp=region_country.loc[countries.region!='Aggregates'].set_index(['region','country']).sort_index()pop_and_expSunburst Chartsimportplotly.graph_objectsasgoimportplotly.ioaspioimporteasyplotlyaseppio.renderers.default='notebook_connected'layout=go.Layout(title='World Population and Life Expectancy<br>Data from the World Bank',height=800)OurSunburstfunction accepts inputs of many types: pandas Series, dictionaries, and list of such objects.
If you want, you can redefinelabels, or add other arguments liketext- use either a Series with an index
identical to that ofvalues, or a function that to any tuple(level0, level1, ... leveln)associates the corresponding label or value.sunburst=ep.Sunburst(pop_and_exp.population,text=pop_and_exp.life_expectancy)go.Figure(sunburst,layout)TreemapsTheTreemapfunction works like theSunburstone:treemap=ep.Treemap(pop_and_exp.population,text=pop_and_exp.life_expectancy)go.Figure(treemap,layout)Just like theSunburstfunction, it also accepts all the arguments supported by the originalgo.Sunburstobject. You're even welcome to use themagic underscore notation,
as we do below when we setmarker.colorswithmarker_colors:importnumpyasnpdefaverage(values,weights):"""Same as np.average, but remove nans"""total_obs=0.total_weight=0.ifisinstance(values,np.float):values=[values]weights=[weights]forx,winzip(values,weights):xw=x*wifnp.isnan(xw):continuetotal_obs+=xwtotal_weight+=wreturntotal_obs/total_weightiftotal_weight!=0elsenp.NaNdeflife_expectancy(item):"""Life expectancy associated to a tuple like (), ('Europe & Central Asia') or ('East Asia & Pacific', 'China')"""sub=pop_and_exp.loc[item]ifitemelsepop_and_expreturnaverage(sub.life_expectancy,weights=sub.population)deftext(item):"""Return the text associated to a tuple like (), ('Europe & Central Asia') or ('East Asia & Pacific', 'China')"""life_exp=life_expectancy(item)iflife_exp>0:pop=pop_and_exp.population.loc[item].sum()ifitemelsepop_and_exp.population.sum()return'Population:{:,}<br>Life expectancy:{:.2f}'.format(int(pop),life_exp)treemap=ep.Treemap(pop_and_exp.population,hoverinfo='label+text',text=text,root_label='World',# magic underscore notationmarker_colors=life_expectancy,marker_colorscale='RdBu')go.Figure(treemap,layout)Sankey PlotPlot links from a dict, or a series with a source/target multiindex:links={('A','B'):3,('B','C'):1,('B','D'):2,('C','A'):1,('D','A'):1,('A','D'):1}go.Figure(ep.Sankey(links))Plot links from a DataFrame (sources as the index, targets as the columns):importpandasaspdlinks=pd.DataFrame(1,index=['Source A','Source B'],columns=['Target'])go.Figure(ep.Sankey(links))We conclude the examples with a plot in which the links are a list of pandas Series:region_income=wb.get_countries().query("region != 'Aggregates'").copy()region_income['population']=wb.get_series('SP.POP.TOTL',mrv=1,id_or_value='id',simplify_index=True)income_lending=region_income.copy()region_income.set_index(['region','incomeLevel'],inplace=True)income_lending.set_index(['incomeLevel','lendingType'],inplace=True)layout=go.Layout(title='Regions income and lending type<br>Data from the World Bank')sankey=ep.Sankey(link_value=[region_income['population'],income_lending['population']],link_label=[region_income['name'],income_lending['name']])go.Figure(sankey,layout)