python创建热力图
时间: 2025-07-08 10:11:32 浏览: 6
<think>我们有两个引用,但用户的问题是关于使用Python创建热力图的教程。根据引用,我们可以使用不同的库,例如引用[1]中可能提到了matplotlib/seaborn,而引用[2]使用了folium来创建地理热力图。用户没有明确说明是哪种热力图,但根据引用[2]的例子,可能是地理热力图。不过,用户的问题更通用,所以我们需要提供两种常见的热力图:矩阵热力图和地理热力图。
步骤:
1. 矩阵热力图(使用seaborn和matplotlib)
2. 地理热力图(使用folium)
我们将分别介绍这两种热力图的绘制方法。
## 一、矩阵热力图(用于二维数据)
使用库:`matplotlib` 和 `seaborn`
安装(如果需要):
```bash
pip install matplotlib seaborn numpy pandas
```
示例代码:
```python
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 创建一个随机的10x10矩阵
data = np.random.rand(10, 10)
# 使用seaborn绘制热力图
plt.figure(figsize=(10, 8))
# 设置热力图的颜色映射,vmin和vmax设置颜色范围
heatmap = sns.heatmap(data, annot=True, fmt=".2f", cmap="YlGnBu", vmin=0, vmax=1)
# 设置标题
plt.title('Matrix Heatmap Example')
plt.show()
```
参数说明:
- `data`: 二维数组(或DataFrame)
- `annot`: 是否在格子中显示数值
- `fmt`: 数值格式,例如".2f"表示保留两位小数
- `cmap`: 颜色映射,可选"viridis", "YlGnBu", "coolwarm"等
- `vmin`, `vmax`: 颜色条的最小值和最大值
## 二、地理热力图(显示在地图上)
使用库:`folium` 和 `folium.plugins.HeatMap`
安装:
```bash
pip install folium
```
示例代码(根据引用[2]修改):
```python
import folium
from folium.plugins import HeatMap
import webbrowser
# 模拟数据:每个数据点为[纬度, 经度, 权重]
# 这里使用中国几个主要城市的数据
data = [
[39.9042, 116.4074, 10], # 北京
[31.2304, 121.4737, 8], # 上海
[23.1291, 113.2644, 6], # 广州
[30.5728, 104.0668, 5], # 成都
[34.3416, 108.9398, 4] # 西安
]
# 创建地图,设置初始位置和缩放级别
map_heat = folium.Map(location=[35, 105], zoom_start=4)
# 将热力图添加到地图
HeatMap(data).add_to(map_heat)
# 保存为html文件
file_path = "heatmap.html"
map_heat.save(file_path)
# 用浏览器打开
webbrowser.open(file_path)
```
说明:
- `location`: 地图初始中心坐标,[纬度, 经度]
- `zoom_start`: 初始缩放级别,数值越大越详细
- `HeatMap`接受一个列表,每个元素是[纬度, 经度, 权重](权重可选,如果没有权重,可以只给两个值)
## 三、其他热力图库
1. **plotly**:可以绘制交互式热力图(包括矩阵热力图和地图热力图)
2. **bokeh**:另一个交互式可视化库
这里提供一个plotly绘制矩阵热力图的简单示例:
```python
import plotly.express as px
import numpy as np
data = np.random.rand(10, 10)
fig = px.imshow(data, color_continuous_scale='Viridis')
fig.show()
```
## 注意事项
1. 矩阵热力图的数据需要是二维的,并且通常需要归一化处理以便于观察。
2. 地理热力图的数据点不能过多,否则会非常密集,可以使用聚类或者采样来减少点。
3. 地理热力图需要经纬度坐标,如果使用地名,需要先通过地理编码转换为经纬度。
根据你的需求选择合适的库和方法。
§§相关问题§§
1. 如何对矩阵热力图进行归一化处理?
2. 如何获取地理热力图中地点的经纬度坐标?
3. 如何调整地理热力图中点的半径和模糊程度?
4. 如何保存热力图为图片(例如png)格式?</think># Python 热力图生成全面教程
热力图是数据可视化中展示二维数据分布的有效工具,下面我将详细介绍如何使用 Python 生成各种类型的热力图。
## 一、热力图基础
热力图通过颜色变化展示数据矩阵中数值的分布情况,常用于:
- 展示相关性矩阵
- 可视化地理数据分布
- 分析时间序列模式
- 显示密度分布
## 二、矩阵热力图(相关性热力图)
使用 `seaborn` 和 `matplotlib` 生成矩阵热力图:
```python
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 创建示例数据矩阵
data = np.random.rand(10, 12) # 10行12列的随机数据
# 创建热力图
plt.figure(figsize=(10, 8))
ax = sns.heatmap(
data,
annot=True, # 显示数值
fmt=".2f", # 数值格式
cmap="YlGnBu", # 颜色映射
linewidths=.5, # 单元格间线宽
vmin=0, vmax=1 # 颜色范围
)
# 添加标题和标签
plt.title("矩阵热力图示例", fontsize=14)
plt.xlabel("X轴标签")
plt.ylabel("Y轴标签")
# 显示图形
plt.show()
```
### 关键参数说明:
| 参数 | 说明 | 常用值 |
|------|------|--------|
| `cmap` | 颜色映射 | "viridis", "coolwarm", "YlOrRd" |
| `annot` | 显示数值 | True/False |
| `fmt` | 数值格式 | ".0f", ".2f" |
| `vmin/vmax` | 颜色范围 | 数值 |
| `linewidths` | 网格线宽 | 0.5-1.0 |
| `cbar` | 显示颜色条 | True/False |
## 三、地理热力图
使用 `folium` 库创建地理热力图(引用[2]方法):
```python
import folium
from folium.plugins import HeatMap
import webbrowser
# 创建示例数据(纬度, 经度, 权重)
data = [
[39.9042, 116.4074, 0.9], # 北京
[31.2304, 121.4737, 0.8], # 上海
[23.1291, 113.2644, 0.7], # 广州
[30.5728, 104.0668, 0.6], # 成都
[34.3416, 108.9398, 0.5], # 西安
[22.5431, 114.0579, 0.4], # 深圳
[38.0428, 114.5149, 0.3] # 石家庄
]
# 创建地图对象
m = folium.Map(
location=[35, 105], # 初始中心位置
zoom_start=4, # 初始缩放级别
tiles='Stamen Toner' # 地图样式
)
# 添加热力图层
HeatMap(
data,
radius=15, # 热力点半径
blur=10, # 模糊度
max_zoom=13 # 最大缩放级别
).add_to(m)
# 保存为HTML文件
file_path = "china_heatmap.html"
m.save(file_path)
# 在浏览器中打开
webbrowser.open(file_path)
```
## 四、时间序列热力图
展示时间相关的数据模式:
```python
import pandas as pd
import seaborn as sns
# 创建示例时间序列数据
dates = pd.date_range('2023-01-01', periods=90)
hours = [f"{h:02d}:00" for h in range(24)]
data = np.random.rand(90, 24) # 90天*24小时
# 创建DataFrame
df = pd.DataFrame(data, index=dates, columns=hours)
# 绘制热力图
plt.figure(figsize=(16, 8))
sns.heatmap(
df,
cmap="YlOrRd",
cbar_kws={'label': '活动强度'}
)
plt.title("每日活动热力图", fontsize=16)
plt.xlabel("小时")
plt.ylabel("日期")
plt.tight_layout()
plt.show()
```
## 五、高级技巧与优化
### 1. 数据归一化处理
```python
from sklearn.preprocessing import MinMaxScaler
# 归一化数据到[0,1]范围
scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(data)
```
### 2. 聚类热力图
```python
# 添加聚类树状图
g = sns.clustermap(
data,
cmap="coolwarm",
standard_scale=1, # 按行归一化
figsize=(12, 8)
)
plt.title("聚类热力图")
```
### 3. 自定义颜色映射
```python
from matplotlib.colors import LinearSegmentedColormap
# 创建自定义颜色映射
colors = ["#2A788E", "#79D151", "#FDE725"]
custom_cmap = LinearSegmentedColormap.from_list("custom", colors)
sns.heatmap(data, cmap=custom_cmap)
```
### 4. 保存高质量图片
```python
plt.savefig('heatmap.png',
dpi=300,
bbox_inches='tight',
transparent=False)
```
## 六、常见问题解决
1. **数据点过多导致模糊**:
- 降低热力点半径(`radius`参数)
- 增加模糊度(`blur`参数)
- 对数据进行聚合或采样
2. **颜色区分度不足**:
- 使用`vmin`和`vmax`明确颜色范围
- 尝试不同颜色映射(`cmap`)
- 增加颜色条范围
3. **地理坐标不准确**:
- 使用`geopy`库转换地址为经纬度:
```python
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="heatmap_app")
location = geolocator.geocode("北京市")
print(location.latitude, location.longitude)
```
## 七、相关工具推荐
1. **交互式热力图**:
- Plotly: `plotly.express.imshow()`
- Bokeh: `bokeh.plotting.figure.rect()`
2. **大数据集处理**:
- Datashader: 适合百万级数据点
- Vaex: 内存高效处理
3. **地理数据处理**:
- Geopandas: 地理空间数据处理
- Contextily: 添加底图
阅读全文
相关推荐









