微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

d = {'count': [1,1,2,3,4],'name': ['bob','bob','shelby','jordan','jeff'],'type': ['type1','type2','type4','type1','type6','type5','type8',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()

解决方法

您可以在 fig.data[0].customdata 中存储一个 numpy 数组,然后从 customdata 字符串访问变量 texttemplate

在您的情况下,由于您想要注释百分比和薪水(并可能添加更多注释),我们可以将这两者存储在我们将 nx2 设置为等于的 fig.data[0].customdata numpy 数组中。然后我们将使用 customdata[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,2,3,4],'name': ['bob','bob','shelby','jordan','jeff'],'type': ['type1','type2','type4','type1','type6','type5','type8',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()

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。