利用python绘制附带饼图的热力图
时间: 2025-06-29 20:23:43 浏览: 17
### 创建带有饼图的热力图
为了实现这一目标,可以先创建一个基本的热力图并在此基础上嵌入饼图。这涉及到两个主要部分的工作:一是构建热力图本身;二是计算和绘制各个单元格内的饼图。
#### 构建热力图框架
Seaborn 的 `sns.heatmap()` 函数能够方便地生成热力图[^2]。然而,默认情况下 Seaborn 和 Matplotlib 并不支持直接在热力图内放置其他图形如饼图。因此,需要通过自定义方式来实现在特定位置添加饼图的效果。
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 假设有一个随机矩阵作为热力图的基础数据
data = np.random.rand(5, 5)
plt.figure(figsize=(8, 6))
sns.heatmap(data, annot=True, fmt=".1f", cmap="YlGnBu")
for i in range(len(data)):
for j in range(len(data[i])):
pie_data = [data[i][j], 1-data[i][j]] # 饼图的数据准备
# 计算当前网格中心坐标以便定位饼图的位置
bbox = dict(boxstyle='round', facecolor='wheat', alpha=0.7)
# 在每个单元格中画一个小圆圈代表饼图的比例关系
circle = plt.Circle((i+0.5, j+0.5), min(0.4, data[i][j]), color=['blue', 'white'], fill=False, clip_on=False)
plt.gca().add_patch(circle)
# 使用text方法替代实际的饼图显示比例数值
plt.text(i+0.5, j+0.5, f"{int(pie_data[0]*100)}%", ha='center', va='center', fontsize=9, fontweight='bold', bbox=bbox)
plt.show()
```
上述代码片段展示了如何在一个简单的热力图之上模拟出具有百分比标签的小圆形区域,这些圆形用来示意性地展示原本应该由饼图表达的信息。由于 Matplotlib 或者 Seaborn 没有内置的支持在同一张图表里混合不同类型的子图(比如热力图加多个独立的饼图),所以这里采取了一种变通的方式——即利用圆形加上文字标注的形式近似表现饼图效果。
对于更复杂的场景,如果确实需要真正的饼图而不是这种简化版,则可能要考虑采用更加灵活的方式来布局整个图像,例如使用 GridSpec 来精确控制各组件之间的相对位置,并单独为每一个想要插入饼图的地方调用 `plt.pie()` 方法。
阅读全文
相关推荐


















