Plotly:将自定义文本添加到 px.Treemap 视觉对象

Col*_*in9 5 python treemap pandas plotly

我正在使用plotlyexpress 来制作树形图。我想用标签以及父级的百分比和色阶中使用的值来注释我的数据扇区。

如何添加注释来显示color树形图参数中使用的实际值?在下面的示例代码中,我想为每个部门注释“薪水”。我还想添加一些额外的文字来描述每个部门的数字。例如,“总计百分比:”附加到百分比值以获取更多文本描述将非常适合帮助对树形图进行更多注释。任何添加自定义文本的方法都是有益的。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.express as px

d = {'count': [1,1,1,2,2,3,3,3,4], 
     'name': ['bob','bob','bob','shelby','shelby','jordan','jordan','jordan','jeff'],
     'type': ['type1','type2','type4','type1','type6','type5','type8','type2',None],
     'salary':[1000,2000,3000,10000,15000,30000,100000,50000,25000]}
df = pd.DataFrame(data=d)

# group data and aggregate
df_plot = df.groupby(['name','type'])[['salary','count']].sum().reset_index()

avg_salary = df_plot['salary'].sum()/df_plot['count'].sum()

# plot treemap
fig = px.treemap(df_plot,
                 values='count',
                 color='salary',
                 color_continuous_scale='balance',
                 color_continuous_midpoint=avg_salary,
                 path=['type','name'])
fig.data[0].textinfo = 'label+value+percent parent'
fig.show()
Run Code Online (Sandbox Code Playgroud)

Der*_*k O 8

您可以存储一个 numpy 数组fig.data[0].customdata,然后customdatatexttemplate字符串访问该变量。

在您的情况下,由于您想要注释百分比和薪水(并且可能添加更多注释),我们可以将它们存储在nx2我们设置为等于的 numpy 数组中fig.data[0].customdatacustomdata[0]然后我们将使用和customdata[1]中的访问数组的每个切片texttemplate

编辑:正如 @Coldchain9 指出的那样,在为自定义数据创建百分比和工资之前,需要按名称和类型对要传递给 px.treemap 的 DataFrame 进行排序,以正确匹配树形图上的名称和类型。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.express as px

d = {'count': [1,1,1,2,2,3,3,3,4], 
     'name': ['bob','bob','bob','shelby','shelby','jordan','jordan','jordan','jeff'],
     'type': ['type1','type2','type4','type1','type6','type5','type8','type2',None],
     'salary':[1000,2000,3000,10000,15000,30000,100000,50000,25000]}
df = pd.DataFrame(data=d)

# group data and aggregate
df_plot = df.groupby(['name','type'])[['salary','count']].sum().reset_index()
df_plot.sort_values(by=['name','type'],inplace=True)

avg_salary = df_plot['salary'].sum()/df_plot['count'].sum()

# plot treemap
fig = px.treemap(df_plot,
                 values='count',
                 color='salary',
                 color_continuous_scale='balance',
                 color_continuous_midpoint=avg_salary,
                 path=['type','name'])
# fig.data[0].textinfo = 'label+value+percent parent'
percents = (100*df.salary / sum(df.salary)).tolist()
salaries = df.salary.tolist()

## store multiple lists of data in customdata
fig.data[0].customdata = np.column_stack([salaries, percents])
fig.data[0].texttemplate = "%{label}<br>%{value}<br>Salary:$%{customdata[0]}<br>Percent of total:%{customdata[1]:.2f}%"
fig.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述