You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Jupyter Notebook中绘制字典数值所有组合和的图表求助

实现方案:生成字典元素所有组合的和并可视化

我来帮你搞定这个需求,下面是在Jupyter Notebook中用matplotlib和seaborn实现的完整步骤,代码可直接运行:

步骤1:导入所需工具库

首先要导入生成组合的工具、数据处理库和可视化库:

import itertools
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

步骤2:预处理原始字典

先把原始字典的键值对按数值降序排序,这样后续生成的组合内部元素可以直接按数值从大到小展示:

dict1 = {'l': 12, 'b': 20, 'k': 1, 'a': 10, 'd': 30}
# 按值降序排序,得到键值对列表
sorted_items = sorted(dict1.items(), key=lambda x: -x[1])
# 提取排序后的键和值,方便后续使用
sorted_keys = [item[0] for item in sorted_items]

步骤3:生成所有非空组合并计算和

用itertools.combinations生成所有长度从1到5的非空组合,同时计算每个组合的和,生成可读性强的组合标签(比如d(30)+b(20)):

combinations_data = []
# 遍历所有可能的组合长度(1到字典元素总数)
for length in range(1, len(sorted_items)+1):
    # 基于排序后的键生成当前长度的所有组合
    for combo in itertools.combinations(sorted_keys, length):
        # 计算组合的和
        combo_sum = sum([dict1[key] for key in combo])
        # 生成组合标签:按数值降序展示元素
        combo_label = "+".join([f"{key}({dict1[key]})" for key in combo])
        # 把数据存入列表
        combinations_data.append({"组合": combo_label, "和": combo_sum})

步骤4:按和降序排序数据

把数据转换成DataFrame,然后按和列降序排列:

df = pd.DataFrame(combinations_data)
# 按和降序排序,若和相同则按组合标签排序(可选)
df_sorted = df.sort_values(by="和", ascending=False).reset_index(drop=True)

步骤5:绘制可视化图表

用seaborn绘制条形图,同时处理x轴标签重叠的问题:

# 设置绘图风格
sns.set_style("whitegrid")
plt.figure(figsize=(12, 8))

# 绘制条形图
sns.barplot(data=df_sorted, x="组合", y="和", palette="viridis")

# 设置图表标题与标签
plt.title("字典元素所有组合的和(降序排列)", fontsize=14)
plt.xlabel("组合(元素按数值降序)", fontsize=12)
plt.ylabel("组合和", fontsize=12)

# 旋转x轴标签,避免重叠
plt.xticks(rotation=90, fontsize=10)

# 调整布局,防止标签被截断
plt.tight_layout()

# 显示图表
plt.show()

额外说明

  • 这里生成的是所有非空组合,如果需要包含空组合(和为0),只需在循环中加入长度为0的情况即可。
  • 组合内的元素默认按数值降序展示,因为我们预先对字典做了排序处理,生成组合时基于排序后的键,标签自然符合要求。
  • 你可以根据实际需求调整图表尺寸、颜色主题或者x轴标签的旋转角度。

内容的提问来源于stack exchange,提问作者user3206440

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:37:02