如何设置Plotly px.sunburst最大值及叠加展示学生挑战完成情况
实现带未完成挑战灰色标记的Plotly旭日图
不用叠加两个旭日图,直接合并两个数据集后统一处理更高效,完全能满足你的需求——展示所有挑战的最大值、已完成项正常着色、未完成项设为灰色。
步骤1:数据预处理
首先需要把两个DataFrame合并,标记每个挑战是否被学生完成,同时确保Value列是数值类型(原数据是字符串,会影响绘图计算):
import pandas as pd import plotly.express as px # 原始数据 challenge_count_df = pd.DataFrame({'Challenge': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], 'Value' : ["5","5","10","15","5","10","5","10","15","10"], 'Category' : ['linux','primer','windows','linux','linux','primer','windows','linux', 'linux', 'primer']}) student_df = pd.DataFrame({'Challenge': ['B', 'C', 'E', 'F', 'G', 'H', 'I'], 'Value' : ["5","10","5","10","5","10","15"], 'Category' : ['primer','windows','linux','primer','windows','linux', 'linux']}) # 转换Value为数值类型 challenge_count_df['Value'] = challenge_count_df['Value'].astype(int) student_df['Value'] = student_df['Value'].astype(int) # 合并数据集,标记是否完成 merged_df = challenge_count_df.merge( student_df[['Challenge']].assign(Completed=True), on='Challenge', how='left' ).fillna({'Completed': False})
步骤2:绘制旭日图
利用color参数区分已完成/未完成项,自定义颜色映射把未完成项设为灰色:
# 定义颜色映射:已完成用默认配色,未完成用灰色 color_map = {True: px.colors.qualitative.Plotly[0], False: '#cccccc'} fig = px.sunburst( merged_df, path=['Category', 'Challenge'], values='Value', color='Completed', color_discrete_map=color_map, title='学生挑战完成情况旭日图' ) # 隐藏图例(可选,因为灰色已经直观表示未完成) fig.update_layout(showlegend=False) fig.show()
效果说明
- 所有挑战都会显示在旭日图中,每个Category的大小由该分类下所有挑战的最大值总和决定
- 学生已完成的挑战会用默认彩色显示,未完成的(A、D、J)会显示为灰色
- 鼠标悬停时可以查看每个挑战的具体数值
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

