GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing plotly.com — Treemap charts in Python Treemap charts visualize hierarchical data using nested rectangles. The input data format is the same as for Sunburst Charts and Icicle Charts: the hierarchy is defined by labels ( Basic Treemap with plotly.express¶Plotly Express is the easy-to-use, high-level interface to Plotly, which operates on a variety of types of data and produces easy-to-style figures. With In [1]:
import plotly.express as px fig = px.treemap( names = ["Eve","Cain", "Seth", "Enos", "Noam", "Abel", "Awan", "Enoch", "Azura"], parents = ["", "Eve", "Eve", "Seth", "Seth", "Eve", "Eve", "Awan", "Eve"] ) fig.update_traces(root_color="lightgrey") fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() Treemap of a rectangular DataFrame with plotly.express¶Hierarchical data are often stored as a rectangular dataframe, with different columns corresponding to different levels of the hierarchy. In [2]:
import plotly.express as px df = px.data.tips() fig = px.treemap(df, path=[px.Constant("all"), 'day', 'time', 'sex'], values='total_bill') fig.update_traces(root_color="lightgrey") fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() Treemap of a rectangular DataFrame with continuous color argument in px.treemap¶If a Note: for best results, ensure that the first In [3]:
import plotly.express as px import numpy as np df = px.data.gapminder().query("year == 2007") fig = px.treemap(df, path=[px.Constant("world"), 'continent', 'country'], values='pop', color='lifeExp', hover_data=['iso_alpha'], color_continuous_scale='RdBu', color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop'])) fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() Treemap of a rectangular DataFrame with discrete color argument in px.treemap¶When the argument of In [4]:
import plotly.express as px df = px.data.tips() fig = px.treemap(df, path=[px.Constant("all"), 'sex', 'day', 'time'], values='total_bill', color='day') fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() In the example below the color of Saturday and Sunday sectors is the same as Dinner because there are only Dinner entries for Saturday and Sunday. However, for Female -> Friday there are both lunches and dinners, hence the "mixed" color (blue here) is used. In [5]:
import plotly.express as px df = px.data.tips() fig = px.treemap(df, path=[px.Constant("all"), 'sex', 'day', 'time'], values='total_bill', color='time') fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() Using an explicit mapping for discrete colors¶For more information about discrete colors, see the dedicated page. In [6]:
import plotly.express as px df = px.data.tips() fig = px.treemap(df, path=[px.Constant("all"), 'sex', 'day', 'time'], values='total_bill', color='time', color_discrete_map={'(?)':'lightgrey', 'Lunch':'gold', 'Dinner':'darkblue'}) fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() Rectangular data with missing values¶If the dataset is not fully rectangular, missing values should be supplied as In [7]:
import plotly.express as px import pandas as pd vendors = ["A", "B", "C", "D", None, "E", "F", "G", "H", None] sectors = ["Tech", "Tech", "Finance", "Finance", "Other", "Tech", "Tech", "Finance", "Finance", "Other"] regions = ["North", "North", "North", "North", "North", "South", "South", "South", "South", "South"] sales = [1, 3, 2, 4, 1, 2, 2, 1, 4, 1] df = pd.DataFrame( dict(vendors=vendors, sectors=sectors, regions=regions, sales=sales) ) df["all"] = "all" # in order to have a single root node print(df) fig = px.treemap(df, path=['all', 'regions', 'sectors', 'vendors'], values='sales') fig.update_traces(root_color="lightgrey") fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() vendors sectors regions sales all 0 A Tech North 1 all 1 B Tech North 3 all 2 C Finance North 2 all 3 D Finance North 4 all 4 None Other North 1 all 5 E Tech South 2 all 6 F Tech South 2 all 7 G Finance South 1 all 8 H Finance South 4 all 9 None Other South 1 all Treemap with Rounded Corners¶New in 5.12 Update treemap sectors to have rounded corners by configuring the In [8]:
import plotly.express as px fig = px.treemap( names = ["Eve","Cain", "Seth", "Enos", "Noam", "Abel", "Awan", "Enoch", "Azura"], parents = ["", "Eve", "Eve", "Seth", "Seth", "Eve", "Eve", "Awan", "Eve"] ) fig.update_traces(marker=dict(cornerradius=5)) fig.show() Basic Treemap with go.Treemap¶If Plotly Express does not provide a good starting point, it is also possible to use the more generic In [9]:
import plotly.graph_objects as go fig = go.Figure(go.Treemap( labels = ["Eve","Cain", "Seth", "Enos", "Noam", "Abel", "Awan", "Enoch", "Azura"], parents = ["", "Eve", "Eve", "Seth", "Seth", "Eve", "Eve", "Awan", "Eve"], root_color="lightgrey" )) fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() Set Different Attributes in Treemap¶This example uses the following attributes:
In [10]:
import plotly.graph_objects as go from plotly.subplots import make_subplots labels = ["Eve", "Cain", "Seth", "Enos", "Noam", "Abel", "Awan", "Enoch", "Azura"] parents = ["", "Eve", "Eve", "Seth", "Seth", "Eve", "Eve", "Awan", "Eve"] fig = make_subplots( cols = 2, rows = 1, column_widths = [0.4, 0.4], subplot_titles = ('branchvalues: <b>remainder<br /> <br />', 'branchvalues: <b>total<br /> <br />'), specs = [[{'type': 'treemap', 'rowspan': 1}, {'type': 'treemap'}]] ) fig.add_trace(go.Treemap( labels = labels, parents = parents, values = [10, 14, 12, 10, 2, 6, 6, 1, 4], textinfo = "label+value+percent parent+percent entry+percent root", root_color="lightgrey" ),row = 1, col = 1) fig.add_trace(go.Treemap( branchvalues = "total", labels = labels, parents = parents, values = [65, 14, 12, 10, 2, 6, 6, 1, 4], textinfo = "label+value+percent parent+percent entry", root_color="lightgrey" ),row = 1, col = 2) fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() Set Color of Treemap Sectors¶There are three different ways to change the color of the sectors in Treemap:
In [11]:
import plotly.graph_objects as go values = [0, 11, 12, 13, 14, 15, 20, 30] labels = ["container", "A1", "A2", "A3", "A4", "A5", "B1", "B2"] parents = ["", "container", "A1", "A2", "A3", "A4", "container", "B1"] fig = go.Figure(go.Treemap( labels = labels, values = values, parents = parents, marker_colors = ["pink", "royalblue", "lightgray", "purple", "cyan", "lightgray", "lightblue", "lightgreen"] )) fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() This example uses In [12]:
import plotly.graph_objects as go values = [0, 11, 12, 13, 14, 15, 20, 30] labels = ["container", "A1", "A2", "A3", "A4", "A5", "B1", "B2"] parents = ["", "container", "A1", "A2", "A3", "A4", "container", "B1"] fig = go.Figure(go.Treemap( labels = labels, values = values, parents = parents, root_color="lightblue" )) fig.update_layout( treemapcolorway = ["pink", "lightgray"], margin = dict(t=50, l=25, r=25, b=25) ) fig.show() In [13]:
import plotly.graph_objects as go values = [0, 11, 12, 13, 14, 15, 20, 30] labels = ["container", "A1", "A2", "A3", "A4", "A5", "B1", "B2"] parents = ["", "container", "A1", "A2", "A3", "A4", "container", "B1"] fig = go.Figure(go.Treemap( labels = labels, values = values, parents = parents, marker_colorscale = 'Blues' )) fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() Treemap chart with a continuous colorscale¶The example below visualizes a breakdown of sales (corresponding to sector width) and call success rate (corresponding to sector color) by region, county and salesperson level. For example, when exploring the data you can see that although the East region is behaving poorly, the Tyler county is still above average -- however, its performance is reduced by the poor success rate of salesperson GT. In the right subplot which has a In [14]:
import plotly.graph_objects as go from plotly.subplots import make_subplots import pandas as pd df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/sales_success.csv') print(df.head()) levels = ['salesperson', 'county', 'region'] # levels used for the hierarchical chart color_columns = ['sales', 'calls'] value_column = 'calls' def build_hierarchical_dataframe(df, levels, value_column, color_columns=None): """ Build a hierarchy of levels for Sunburst or Treemap charts. Levels are given starting from the bottom to the top of the hierarchy, ie the last level corresponds to the root. """ df_list = [] for i, level in enumerate(levels): df_tree = pd.DataFrame(columns=['id', 'parent', 'value', 'color']) dfg = df.groupby(levels[i:]).sum() dfg = dfg.reset_index() df_tree['id'] = dfg[level].copy() if i < len(levels) - 1: df_tree['parent'] = dfg[levels[i+1]].copy() else: df_tree['parent'] = 'total' df_tree['value'] = dfg[value_column] df_tree['color'] = dfg[color_columns[0]] / dfg[color_columns[1]] df_list.append(df_tree) total = pd.Series(dict(id='total', parent='', value=df[value_column].sum(), color=df[color_columns[0]].sum() / df[color_columns[1]].sum()), name=0) df_list.append(total) df_all_trees = pd.concat(df_list, ignore_index=True) return df_all_trees df_all_trees = build_hierarchical_dataframe(df, levels, value_column, color_columns) average_score = df['sales'].sum() / df['calls'].sum() fig = make_subplots(1, 2, specs=[[{"type": "domain"}, {"type": "domain"}]],) fig.add_trace(go.Treemap( labels=df_all_trees['id'], parents=df_all_trees['parent'], values=df_all_trees['value'], branchvalues='total', marker=dict( colors=df_all_trees['color'], colorscale='RdBu', cmid=average_score), hovertemplate='<b>%{label} </b> <br> Sales: %{value}<br> Success rate: %{color:.2f}', name='' ), 1, 1) fig.add_trace(go.Treemap( labels=df_all_trees['id'], parents=df_all_trees['parent'], values=df_all_trees['value'], branchvalues='total', marker=dict( colors=df_all_trees['color'], colorscale='RdBu', cmid=average_score), hovertemplate='<b>%{label} </b> <br> Sales: %{value}<br> Success rate: %{color:.2f}', maxdepth=2 ), 1, 2) fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() Unnamed: 0 region county salesperson calls sales 0 0 North Dallam JE 35 23 1 1 North Dallam ZQ 49 13 2 2 North Dallam IJ 20 6 3 3 North Hartley WE 39 37 4 4 North Hartley PL 42 37 In [15]:
import plotly.graph_objects as go import pandas as pd df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/96c0bd/sunburst-coffee-flavors-complete.csv') fig = go.Figure() fig.add_trace(go.Treemap( ids = df.ids, labels = df.labels, parents = df.parents, maxdepth=3, root_color="lightgrey" )) fig.update_layout(margin = dict(t=50, l=25, r=25, b=25)) fig.show() Controlling text fontsize with uniformtext¶If you want all the text labels to have the same size, you can use the Note: animated transitions are currently not implemented when In [16]:
import plotly.graph_objects as go import pandas as pd df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/96c0bd/sunburst-coffee-flavors-complete.csv') fig = go.Figure(go.Treemap( ids = df.ids, labels = df.labels, parents = df.parents, pathbar_textfont_size=15, root_color="lightgrey" )) fig.update_layout( uniformtext=dict(minsize=10, mode='hide'), margin = dict(t=50, l=25, r=25, b=25) ) fig.show() In [17]:
import plotly.graph_objects as go fig = go.Figure( go.Treemap( labels = ["Eve","Cain", "Seth", "Enos", "Noam", "Abel", "Awan", "Enoch", "Azura"], parents=["", "Eve", "Eve", "Seth", "Seth", "Eve", "Eve", "Awan", "Eve"], root_color="lightgrey", textfont_size=20, marker=dict(pattern=dict(shape=["|"], solidity=0.80)), ) ) fig.show() Reference¶See function reference for What About Dash?¶Dash is an open-source framework for building analytical applications, with no Javascript required, and it is tightly integrated with the Plotly graphing library. Learn about how to install Dash at https://dash.plot.ly/installation. Everywhere in this page that you see import plotly.graph_objects as go # or plotly.express as px fig = go.Figure() # or any Plotly Express function e.g. px.bar(...) # fig.add_trace( ... ) # fig.update_layout( ... ) from dash import Dash, dcc, html app = Dash() app.layout = html.Div([ dcc.Graph(figure=fig) ]) app.run(debug=True, use_reloader=False) # Turn off reloader if inside Jupyter
|
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |