Python绘图库及图像类型之基础图表-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/148433762?spm=1001.2014.3001.5501
用 Python 绘制热力图(Heatmap)详解:从数据到可视化全流程(第三天)_python heatmap-CSDN博客https://blog.csdn.net/2401_84301183/article/details/146536553
类别 | 具体作用/场景 | 说明/示例 |
---|---|---|
核心作用 | 直观展示数据密度/强度分布 | 用颜色深浅(暖色表高值,冷色表低值)快速揭示数据集中高低值区域及分布模式。 |
揭示模式、趋势和异常 | 识别热点(高值聚集)、冷点(低值聚集)、梯度变化、异常值。 | |
高效比较多变量/类别间关系 | 矩阵热力图中通过颜色比较行、列代表的类别/变量间关系强度(如相关性、频率)。 | |
简化高维数据表达 | 将二维(如坐标+值)或三维(如行类+列类+值)数据压缩到平面视图,用颜色编码。 | |
空间效率高 | 在有限空间内展示大量数据点或关系对比,优于重叠散点图或多条形图。 | |
主要实现场景 | 地理空间数据分析 (Geospatial) | 应用领域: 人口、犯罪、交通、房产、疾病、天气、商业选址等。 示例: 人口密度图、交通拥堵热图、疫情分布图、商场客流量热图。 |
网站和用户行为分析 (Web & UX) | 应用领域: 网页/App设计优化、用户体验研究。 示例: 点击热图(分析按钮点击)、滚动热图(分析页面浏览深度)、鼠标移动热图(分析浏览路径)、眼动追踪热图(分析视觉焦点)。 |
|
数据分析和统计学 (Data Analysis & Statistics) | 应用领域: 探索性数据分析、模型评估、关系挖掘。 示例: 相关性矩阵(展示变量间相关系数)、混淆矩阵(评估分类模型性能)、缺失值模式热图、聚类结果热图(展示基因表达模式等)。 |
# seaborn.heatmap 是 Python 可视化库 Seaborn 中用于绘制热力图的函数,通过颜色变化直观展示二维矩阵数据(如相关矩阵、混淆矩阵等)。
sns.heatmap(
data, # 必需参数:二维数据(数组、DataFrame)
vmin=None, # 颜色映射最小值
vmax=None, # 颜色映射最大值
cmap=None, # 颜色方案(如 'viridis', 'coolwarm', 'RdBu_r')
center=None, # 颜色中心值(常用于有正负的数据)
robust=False, # 抗异常值缩放(使用分位数替代极值)
annot=None, # 是否在格子中显示数值(True/False 或 同shape数组)
fmt='.2g', # 数值格式(如 '.1f' 保留1位小数)
annot_kws=None, # 注释文本样式(字典,如 {'size':10})
linewidths=0, # 格子边框宽度
linecolor='white', # 边框颜色
cbar=True, # 是否显示颜色条
cbar_kws=None, # 颜色条设置(字典,如 {'label':'Score'})
square=False, # 是否强制为正方形
xticklabels='auto', # X轴标签(True/False/列表/'auto')
yticklabels='auto', # Y轴标签(同上)
mask=None, # 遮盖部分数据(True位置不显示)
ax=None, # 指定绘图的Axes对象
**kwargs # 其他matplotlib参数
)
参数 | 默认值 | 数据类型 | 说明 |
---|---|---|---|
data |
- | 2D array/DataFrame | 必需参数,输入矩阵数据 |
vmin |
None | float | 颜色映射最小值 |
vmax |
None | float | 颜色映射最大值 |
cmap |
None | str/Colormap | 颜色映射方案(如 'viridis', 'coolwarm', 'RdBu_r') |
center |
None | float | 颜色中心值(用于有正负值的数据) |
annot |
None | bool/array | 是否在格子中显示数值(True 或同形数组) |
fmt |
'.2g' | str | 数值格式(如 '.2f'=两位小数,'d'=整数) |
linewidths |
0 | float | 格子边框宽度(0=无边框) |
linecolor |
'white' | str | 边框颜色 |
cbar |
True | bool | 是否显示颜色条 |
cbar_kws |
None | dict | 颜色条参数(如 {'label': 'Score'}) |
square |
False | bool | 是否强制为正方形 |
xticklabels |
'auto' | bool/list/'auto' | X轴标签控制(True=显示,False=隐藏) |
yticklabels |
'auto' | bool/list/'auto' | Y轴标签控制 |
mask |
None | bool array | 遮盖部分数据(True位置留白) |
robust |
False | bool | 是否使用分位数抗异常值 |
annot_kws |
None | dict | 注释文本样式(如 {'size':10, 'color':'black'}) |
ax |
None | matplotlib Axes | 指定绘图的坐标轴 |
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.colors import LinearSegmentedColormap
# 设置中文支持(如果需要)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'Microsoft YaHei', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False
# 创建示例数据
def generate_sample_data():
# 创建日期范围
dates = pd.date_range(start='2023-01-01', end='2023-01-15')
# 创建时间范围
times = [f"{hour:02d}:00" for hour in range(8, 18)]
# 创建随机数据
np.random.seed(42)
data = np.random.rand(len(dates), len(times)) * 100
# 添加一些模式使数据更有趣
for i in range(len(dates)):
# 周末模式
if dates[i].weekday() >= 5: # 周六和周日
data[i, :] *= 0.7 # 周末值较低
# 中午高峰模式
data[i, 4:7] *= 1.5 # 中午12点到下午2点
# 创建DataFrame
df = pd.DataFrame(data, index=dates.strftime('%Y-%m-%d'), columns=times)
return df
# 创建自定义颜色映射
def create_custom_colormap():
colors = ["#2a9d8f", "#e9c46a", "#f4a261", "#e76f51"]
return LinearSegmentedColormap.from_list("custom_cmap", colors)
# 绘制热力图并添加注解
def plot_heatmap_with_annotations(df):
# 创建图形
plt.figure(figsize=(14, 10))
# 创建自定义颜色映射
custom_cmap = create_custom_colormap()
# 绘制热力图
ax = sns.heatmap(
df,
cmap=custom_cmap,
annot=True, # 显示数值注解
fmt=".1f", # 数值格式(保留一位小数)
annot_kws={"size": 9, "color": "black"}, # 注解文本样式
linewidths=0.5, # 单元格之间的线条宽度
linecolor="white", # 线条颜色
cbar_kws={"label": "活动强度", "shrink": 0.8} # 颜色条设置
)
# 设置标题和标签
plt.title("每日活动强度热力图 (2023年1月1日-15日)", fontsize=16, pad=20)
plt.xlabel("时间", fontsize=12)
plt.ylabel("日期", fontsize=12)
# 旋转x轴标签
plt.xticks(rotation=45, ha='right')
# 添加网格线(在热力图后面)
ax.set_facecolor('#f0f0f0')
ax.grid(which='major', axis='both', linestyle='-', color='white', linewidth=0.5)
# 调整布局
plt.tight_layout()
# 保存图表
save_path = "heatmap_with_annotations.png"
plt.savefig(save_path, dpi=300, bbox_inches='tight')
# 显示图表
plt.show()
return save_path
# 主程序
if __name__ == "__main__":
# 生成示例数据
data_df = generate_sample_data()
print("生成的热力图数据示例:")
print(data_df.head())
# 绘制并保存热力图
saved_path = plot_heatmap_with_annotations(data_df)
print(f"\n热力图已保存至: {saved_path}")
用python绘制小提琴图的基本流程及其操作_python 小提琴图-CSDN博客https://blog.csdn.net/weixin_70682362/article/details/148018533
作用类别 | 核心作用描述 | 典型实现场景 | 对比优势 |
---|---|---|---|
分布形态可视化 | 直观展示连续数据的整体分布形状、概率密度(哪里密集、哪里稀疏) | 1. 观察单个变量的数据分布特征(单峰、双峰、多峰、对称、偏态)。 2. 数据探索阶段了解数据的基本形态。 |
优于箱线图:清晰揭示分布形状(如多峰性、不对称性),箱线图仅显示摘要统计。 |
集中趋势比较 | 显示数据分布的中心位置(通常结合箱线图元素显示中位数/四分位数) | 1. 比较不同类别/分组数据的中心趋势(如中位数)差异。 2. 观察不同实验条件下结果的中心位置变化。 |
结合密度与统计量:既看密度集中区域,也看具体中位数位置。 |
离散程度比较 | 通过“小提琴”的宽度变化展示数据分布的离散程度(宽=分散,窄=集中) | 1. 比较不同类别/分组数据的变异性或一致性(如评估不同生产工艺的稳定性)。 2. 识别方差差异显著的组别。 |
优于箱线图:宽度变化直观体现数据点在整个值域上的疏密程度,而不仅是IQR。 |
分布对称性/偏度分析 | 通过形状的对称性判断数据分布是左偏(负偏)、右偏(正偏)还是对称 | 1. 分析数据是否符合对称分布假设(如某些统计检验前提)。 2. 识别收入、响应时间等常见偏态数据的偏斜方向。 |
优于直方图/密度图:在多组比较时,并排小提琴图更易对比不同组的偏斜情况。 |
多组分布对比 | 将多个组/类别的分布并排或叠加显示,便于直接比较其形态、中心和离散度差异 | 1. 比较不同产品/型号的性能指标分布。 2. 分析不同营销策略下客户购买金额的分布差异。 3. 评估不同治疗方法下患者康复时间的分布。 4. 对比不同地区的气温分布模式。 5. 分析不同用户群(如新/老用户)使用时长/消费频率的分布。 |
核心优势:最擅长同时比较多个组的完整分布特征,信息量远大于仅比较均值或中位数。 |
异常值检测 (辅助) | 结合箱线图元素(通常内嵌),可识别潜在的异常值点 | 1. 在观察整体分布的同时,辅助查看是否存在显著偏离主体的极端值。 | 结合优势:密度形态提供上下文,箱线图元素标记异常点。 |
数据清洗/验证 | 揭示数据分布中意想不到的模式或问题(如双峰可能暗示数据混合了不同群体) | 1. 数据质量检查:发现分布异常(如预期单峰却出现双峰,可能需检查数据来源或分组)。 2. 识别数据子群或潜在分段。 |
揭示隐藏信息:能提示数据背后可能存在的未考虑因素或分组。 |
# seaborn.violinplot() 是用于绘制小提琴图的函数,它结合了箱线图和核密度估计(KDE)的特点,能直观展示数据的分布、概率密度及关键统计量。
seaborn.violinplot(
x=None, y=None, hue=None, data=None,
order=None, hue_order=None,
bw='scott', cut=2, scale='area', scale_hue=True, gridsize=100,
width=0.8, inner='box', split=False, dodge=True, orient=None,
linewidth=None, color=None, palette=None, saturation=0.75,
ax=None, **kwargs
)
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
x |
字符串/数组 | None |
X轴变量(分类数据) |
y |
字符串/数组 | None |
Y轴变量(数值数据) |
hue |
字符串 | None |
分组变量(次级分类维度) |
data |
DataFrame | None |
数据源(需配合x/y/hue使用) |
order |
列表 | None |
指定x变量顺序(如['Mon','Tue','Wed']) |
hue_order |
列表 | None |
指定hue分组顺序(如['Male','Female']) |
bw |
字符串/浮点数 | 'scott' |
核密度估计带宽:'scott' /'silverman' (自动计算)数值(值越小越贴合数据) |
scale |
字符串 | 'area' |
小提琴宽度缩放方式:'area' (面积相同)'count' (宽度与样本量成正比)'width' (最大宽度相同) |
inner |
字符串 | 'box' |
内部显示元素:'box' (微型箱线图)'quartiles' (四分位线)'point' /'stick' (点/线)None (不显示) |
split |
布尔值 | False |
当使用hue时:True (左右对称合并)False (独立显示) |
dodge |
布尔值 | True |
当使用hue时:True (并排显示)False (重叠显示) |
orient |
字符串 | None |
方向:'v' (垂直)'h' (水平)None (自动推断) |
palette |
字符串/列表 | None |
配色方案(如'viridis' /'Set2' ) |
color |
颜色值 | None |
统一设置所有小提琴颜色 |
width |
浮点数 | 0.8 |
小提琴最大宽度(0~1) |
linewidth |
浮点数 | 1 |
轮廓线宽度(像素) |
cut |
浮点数 | 2 |
数据范围外的延伸倍数(0=不延伸) |
gridsize |
整数 | 100 |
密度曲线平滑度(值越大越平滑) |
pip install seaborn matplotlib numpy
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体支持(如果需要显示中文)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 创建示例数据(替代seaborn内置数据集)
np.random.seed(42)
data = {
'Day': np.repeat(['Mon', 'Tue', 'Wed', 'Thu'], 100),
'Sales': np.hstack([ # 修改为np.hstack
np.random.normal(120, 20, 100),
np.random.normal(80, 15, 100),
np.random.normal(150, 30, 100),
np.random.normal(95, 25, 100)
])
}
# 创建图形
plt.figure(figsize=(10, 6))
ax = sns.violinplot(
x='Day',
y='Sales',
data=data,
hue='Day', # 新增hue参数
inner='quartile',
palette='Pastel1',
legend=False # 隐藏图例
)
# 添加标题和标签
plt.title('每日销售额分布', fontsize=14)
plt.xlabel('星期', fontsize=12)
plt.ylabel('销售额 (万元)', fontsize=12)
# 计算并添加中位数注释
medians = [np.median(data['Sales'][data['Day'] == day]) for day in ['Mon', 'Tue', 'Wed', 'Thu']]
vertical_offset = np.mean(medians) * 0.05 # 偏移量
for i, median in enumerate(medians):
ax.text(
x=i,
y=median + vertical_offset,
s=f'中位: {median:.1f}',
ha='center', # 水平居中
va='bottom', # 垂直底部对齐
fontsize=10,
color='black',
weight='bold'
)
# 添加特殊注释
ax.annotate('最高销售额区间',
xy=(2, 200),
xytext=(2.5, 220),
arrowprops=dict(arrowstyle='->', color='red', linewidth=1.5),
fontsize=12,
color='darkred',
bbox=dict(boxstyle="round,pad=0.3", fc="white", ec="gray", lw=1))
# 添加网格线
plt.grid(axis='y', linestyle='--', alpha=0.7)
# 保存高清图像(支持多种格式:png, jpg, svg, pdf)
plt.savefig('violin_plot.png',
dpi=300, # 高分辨率
bbox_inches='tight', # 紧凑布局
facecolor='white') # 背景色
# 显示图像(可选)
plt.tight_layout()
plt.show()
print("图像已保存为 violin_plot.png")
Python绘制3D曲面图-CSDN博客https://blog.csdn.net/weixin_41923961/article/details/83998917
维度 | 描述 | 典型实现场景 |
---|---|---|
核心作用 | 可视化三维空间中的连续表面 | 理解复杂数学函数、物理现象的空间分布。 |
揭示变量间的非线性关系 | 分析两个自变量(X, Y)对因变量(Z)的共同影响(尤其非线性关系)。 | |
展示空间数据的分布、趋势和模式 | 地理高程、物理场(温度/压力/电势)、浓度分布的空间变化。 | |
识别关键特征点(峰值、谷值、鞍点) | 定位最大值、最小值、转折点或急剧变化区域。 | |
实现场景 | 数学与函数可视化 | 绘制二元函数图像(如 Z = sin(X²+Y²) ),分析函数形状。 |
地理信息系统 | 地形图、数字高程模型、坡度分析、洪水模拟。 | |
物理学与工程学 | • 电磁场:电势/磁场分布 • 力学:应力分布、振动模态 • 流体力学:流速/压力场 • 热力学:温度场分布 |
|
化学与材料科学 | • 分子建模:电子云密度、势能面 • 材料表征:表面粗糙度、成分浓度分布 |
|
气象与海洋学 | • 气象:大气压力/温度场 • 海洋:海水温度/盐度垂直剖面 |
|
医学与生物科学 | • 医学:器官3D重建(CT/MRI) • 生物学:蛋白质结构表面、药物扩散模拟 |
|
计算机图形学 | 渲染复杂3D模型表面(如游戏场景、角色) | |
数据分析 | • 优化算法:损失函数曲面 • 响应面分析:多变量对输出的影响 |
# ax.plot_surface() 是 Matplotlib 中用于绘制 3D 曲面的核心函数(位于 mpl_toolkits.mplot3d 模块)。
ax.plot_surface(X, Y, Z,
cmap=None, # 颜色映射
rstride=1, # 行方向步长
cstride=1, # 列方向步长
color=None, # 固定颜色
edgecolor=None, # 网格线颜色
alpha=1.0, # 透明度
shade=True, # 是否启用阴影
antialiased=True, # 抗锯齿
norm=None, # 数据归一化
vmin=None, vmax=None # 颜色映射范围
**kwargs)
参数 | 说明 |
---|---|
X, Y, Z |
必需,均为 2D 数组(形状相同)。通常用 numpy.meshgrid() 生成 |
cmap |
颜色映射(如 'viridis' , 'plasma' , 'coolwarm' ),需配合 facecolors 或 Z 值使用 |
rstride , cstride |
网格采样步长(减少可提升性能)。例如 rstride=5 表示每隔5行绘制 |
color |
固定曲面颜色(字符串或 RGB 元组),与 cmap 互斥 |
edgecolor |
网格线颜色(默认 'k' 黑色),设为 'none' 可隐藏网格 |
alpha |
透明度(0.0 透明 ~ 1.0 不透明) |
shade |
是否用光照效果增强立体感(默认为 True ) |
antialiased |
是否启用抗锯齿(默认为 True ) |
vmin , vmax |
颜色映射的数据范围(配合 cmap 使用) |
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 创建数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2)) # 生成曲面数据 (二维sinc函数)
# 创建图形和3D坐标轴
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, projection='3d')
# 绘制曲面图
surf = ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8,
rstride=2, cstride=2, antialiased=True)
# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=10, label='Z Value')
# 添加全局标题
plt.suptitle('3D Surface Plot with Annotations', fontsize=16)
# 添加轴标签
ax.set_xlabel('X Axis', fontsize=12, labelpad=15)
ax.set_ylabel('Y Axis', fontsize=12, labelpad=15)
ax.set_zlabel('Z Axis', fontsize=12, labelpad=15)
# 添加点注解
point = (0, 0, 1) # 要注解的点 (x, y, z)
ax.scatter(*point, color='red', s=100, label='Global Max')
ax.text(point[0], point[1], point[2] + 0.2,
'Global Maximum',
color='red',
fontsize=12,
ha='center')
# 添加指向局部最小值的箭头注解
min_point = (-3.5, 3.5, Z[35, 35])
ax.scatter(*min_point, color='blue', s=80)
ax.annotate('Local Minimum',
xy=(min_point[0], min_point[1]), # 目标点
xytext=(-50, 30), # 文本位置偏移
textcoords='offset points',
arrowprops=dict(arrowstyle='->', lw=1.5, color='blue'),
fontsize=10,
color='blue')
# 添加图例
ax.legend(loc='upper right', fontsize=10)
# 调整视角
ax.view_init(elev=25, azim=-45) # 仰角25度,方位角-45度
# 添加图形框注释
fig.text(0.05, 0.02,
'Generated by Matplotlib | Function: sin(sqrt(x² + y²))',
fontsize=9,
color='gray')
# 保存高分辨率图片
plt.savefig('3d_surface_plot.png', dpi=300, bbox_inches='tight')
# 显示图形
plt.tight_layout()
plt.show()
Python绘制地图神器folium介绍及安装使用教程-CSDN博客https://blog.csdn.net/python2021_/article/details/123652555
作用类别 | 具体作用描述 | 典型实现场景举例 | 核心价值 |
---|---|---|---|
空间认知与定位 | 提供地球表面或特定区域的空间位置、形状、大小、方向等基础地理信息。 | * 日常生活导航: 手机地图APP(如百度、高德、Google Maps)查找地点、规划路线。 * 位置查询: 查找酒店、餐厅、景点、加油站等POI(兴趣点)的位置。 * 区域概览: 查看国家、省、市、县、乡镇的行政边界和范围。 |
建立空间框架,理解“在哪里”。 |
空间关系展示 | 可视化地展示地理要素(点、线、面)之间的空间关系(邻近、包含、相交、叠加等)。 | * 城市规划: 展示道路网、建筑地块、绿地、水系的空间布局关系。 * 设施选址: 分析候选位置与现有设施(如学校、医院、竞争对手)、人口分布、交通可达性的关系。 * 环境监测: 显示污染源、监测点、敏感区域(如水源地)的空间分布与距离关系。 |
揭示地理要素间的相互联系和格局。 |
空间分布可视化 | 将具有空间位置的数据(人口、经济、环境、事件等)以图形方式直观呈现其分布特征。 | * 人口密度图: 展示不同区域的人口集中程度。 * 疾病分布图: 追踪流行病或地方病的空间传播。 * 经济活动图: 显示GDP、产业分布、消费水平的地域差异。 * 犯罪热点图: 识别案件高发区域。 * 气象云图: 展示温度、降水、气压等的空间分布。 |
直观揭示数据的空间模式、聚集性、热点/冷点区域和地域差异。 |
导航与路径规划 | 提供从一个地点到另一个地点的最佳或可行路径指导。 | * 驾车导航: 实时规划避开拥堵、收费少、时间短的驾驶路线。 * 公共交通导航: 规划包含公交、地铁、步行等多种方式的换乘方案。 * 步行/骑行导航: 提供适合行人和骑手的路径。 * 物流配送: 优化快递、外卖的配送路线和顺序。 |
提供高效的移动解决方案,节省时间和成本。 |
空间分析与决策 | 基于地图进行复杂的空间运算和建模,提取信息、发现规律、预测趋势、支持决策。 | * 选址分析: 综合交通、人口、竞争、成本等因素确定最优开店/建厂位置。 * 视域分析: 规划监控摄像头覆盖范围或景区观景点视野范围。 * 缓冲区分析: 确定污染源影响范围、划定保护区边界。 * 叠加分析: 将不同图层(如土壤类型、坡度、土地利用)叠加,评估土地适宜性(如农业、建设)。 * 网络分析: 计算服务覆盖范围(如消防站、急救中心)、寻找最近设施。 |
将空间数据转化为洞察力,为科学决策提供定量依据。 |
资源管理与规划 | 用于监测、评估、规划和可持续管理自然资源和人文资源。 | * 土地资源管理: 土地调查、地籍管理、土地利用规划与变更监测。 * 森林资源管理: 森林覆盖监测、火灾预警、采伐规划。 * 水资源管理: 流域规划、水质监测、洪水淹没模拟与风险评估。 * 城市规划: 城市扩张模拟、基础设施规划(道路、管线)、公共服务设施布局优化。 * 农业精准管理: 农田地块划分、作物长势监测、变量施肥/灌溉指导。 |
优化资源配置,提高管理效率,促进可持续发展。 |
灾害监测与应急响应 | 用于灾害风险评估、实时监测、预警发布、灾情评估和应急资源调度。 | * 风险评估: 绘制地震带、洪水淹没区、滑坡隐患点地图。 * 实时监测: 利用卫星/无人机影像监测火灾、洪涝、台风路径。 * 灾情评估: 快速获取受灾范围、损毁程度。 * 应急指挥: 定位受灾点、规划救援路线、调度救援力量和物资。 |
提升灾害预警能力,加速应急响应,减少生命财产损失。 |
历史变迁与趋势研究 | 通过不同时期地图的对比,展示地理环境、城市形态、土地利用等的历史变化和发展趋势。 | * 城市历史地图: 展示城市扩张、街区演变。 * 海岸线变化图: 监测侵蚀或淤积。 * 土地利用变化图: 分析耕地、林地、建设用地的转化。 * 气候变化研究: 可视化冰川退缩、海平面上升等长期变化。 |
理解过去,洞察变化规律,预测未来发展趋势。 |
教育与科普 | 作为教学和科普的重要工具,直观展示地理知识、国家疆域、自然人文现象。 | * 课堂教学: 地理、历史、环境科学等课程的教学辅助。 * 博物馆/科技馆: 互动地图展示地理、历史、科技知识。 * 旅游宣传: 景区手绘地图、电子导览图。 * 国家版图意识教育: 准确展示国家领土和边界。 |
形象直观,激发兴趣,传播知识,增强空间认知和爱国意识。 |
军事与国防 | 提供战场环境信息、部署态势、行动规划和作战指挥支持(保密性强)。 | * 地形分析: 研究战场地形、地貌、交通条件。 * 态势标绘: 显示敌我双方部署和行动。 * 精确制导: 为武器系统提供精确地理坐标。 * 军事演习规划: 模拟推演和行动计划制定。 |
提供关键战场空间信息,支持战略战术决策(高度专业化应用)。 |
# plt.figure() 是 Matplotlib 中用于创建或激活图形窗口的核心函数。
plt.figure(
num=None, # 图形标识符
figsize=None, # 图形尺寸(宽, 高)
dpi=None, # 分辨率(每英寸点数)
facecolor=None, # 背景色
edgecolor=None, # 边框颜色
frameon=True, # 是否显示边框
FigureClass=Figure, # 图形类
clear=False, # 是否清除已有图形
**kwargs
)
# ax.add_feature() 是 Python 地理绘图库 Cartopy 中的一个核心函数,用于向地图坐标轴(GeoAxes 对象)添加地理特征(如海岸线、国界、河流等)。
ax.add_feature(feature, **kwargs)
plt.figure
参数 | 数据类型 | 默认值 | 说明 | 常用值示例 |
---|---|---|---|---|
num |
int / str | None | 图形标识符 • 整数:图形编号 • 字符串:图形名称 • None:自动编号 |
1 , 2 , "Results" |
figsize |
(float, float) | (6.4, 4.8) |
图形尺寸 (宽度, 高度) 单位:英寸 |
(8, 4) , (10, 5) , (12, 6) |
dpi |
int | 100 |
分辨率 每英寸点数(Dots Per Inch) |
80 , 100 , 150 , 200 |
facecolor |
str / color | 'white' |
图形背景颜色 | 'white' , '#f0f0f0' , 'lightblue' |
edgecolor |
str / color | 'black' |
图形边框颜色 | 'black' , 'gray' , 'blue' |
frameon |
bool | True |
是否显示图形边框 | True (显示), False (隐藏) |
clear |
bool | False |
是否清除现有图形内容 (当图形已存在时) |
False (保留内容), True (清空图形) |
add_feature
import cartopy.feature as cfeature
ax.add_feature(cfeature.COASTLINE) # 海岸线
ax.add_feature(cfeature.BORDERS) # 国界
ax.add_feature(cfeature.LAKES) # 湖泊
ax.add_feature(cfeature.RIVERS) # 河流
ax.add_feature(cfeature.LAND) # 陆地填充
ax.add_feature(cfeature.OCEAN) # 海洋填充
参数 | 作用 | 示例值 |
---|---|---|
edgecolor |
边界颜色 | 'black' , '#FF0000' |
facecolor |
填充颜色 | 'lightblue' |
linewidth |
线宽 | 1.5 |
linestyle |
线型 | '--' , ':' |
alpha |
透明度(0-1) | 0.6 |
zorder |
图层叠放顺序 | 2 (数值越大越靠上) |
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统使用黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 创建地图
fig = plt.figure(figsize=(12, 12))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
# 添加地理特征
ax.add_feature(cfeature.OCEAN, facecolor='#E6F3FF') # 海洋颜色
ax.add_feature(cfeature.LAND, facecolor='#FFF2CC') # 陆地颜色
ax.add_feature(cfeature.COASTLINE, linewidth=0.8) # 海岸线
ax.add_feature(cfeature.BORDERS, linestyle=':', linewidth=0.8) # 国界线
# 设置中国区域范围
ax.set_extent([73, 135, 15, 55], crs=ccrs.PlateCarree())
# 定义主要城市
cities = {
'北京': (116.4, 40.2),
'上海': (121.47, 31.23),
'广州': (113.26, 23.12),
'深圳': (114.06, 22.55),
'重庆': (106.54, 29.59),
'成都': (104.06, 30.67),
'武汉': (114.30, 30.60),
'西安': (108.93, 34.27),
'乌鲁木齐': (87.62, 43.82),
'拉萨': (91.11, 29.65),
'哈尔滨': (126.63, 45.75),
'台北': (121.56, 25.03)
}
# 添加城市标记和标注
for city, (lon, lat) in cities.items():
# 绘制标记点
ax.plot(lon, lat, 'ro', markersize=8, transform=ccrs.PlateCarree(), alpha=0.7)
# 设置偏移量
offset_x, offset_y = 1.5, 1
# 特殊位置调整
if city == '重庆':
offset_x, offset_y = -3, -1
elif city == '拉萨':
offset_x, offset_y = -3, -0.5
elif city == '乌鲁木齐':
offset_x, offset_y = -4, 0
elif city == '哈尔滨':
offset_x, offset_y = -1, 1
elif city == '台北':
offset_x, offset_y = 0, -2
# 添加文字标注
ax.text(
lon + offset_x,
lat + offset_y,
city,
fontsize=12,
fontweight='bold',
color='darkred',
transform=ccrs.PlateCarree(),
bbox=dict(facecolor='white', alpha=0.8, boxstyle='round,pad=0.3', edgecolor='gray')
)
# 添加特殊标注(带箭头)
ax.annotate(
'首都北京',
xy=(116.4, 40.2),
xytext=(100, 45),
arrowprops=dict(
arrowstyle="fancy",
color='#CC0000',
connectionstyle="arc3,rad=0.3",
linewidth=2
),
fontsize=14,
fontweight='bold',
color='#CC0000',
transform=ccrs.PlateCarree()
)
# 添加地图元素
# ax.set_title('中国主要城市分布图', fontsize=20, pad=35, y=1.05)
# 添加网格
ax.gridlines(draw_labels=True, linewidth=0.5, color='gray', alpha=0.5, linestyle='--')
# 添加比例尺
scale_bar_length = 10 # 10度经度
ax.plot([100, 100 + scale_bar_length], [18, 18], 'k-', linewidth=2, transform=ccrs.PlateCarree())
ax.text(100 + scale_bar_length / 2, 17, f'{scale_bar_length}°',
horizontalalignment='center', fontsize=10, transform=ccrs.PlateCarree())
# 添加指北针
ax.text(134, 52, 'N', fontsize=15, fontweight='bold',
horizontalalignment='center', transform=ccrs.PlateCarree())
ax.plot([134, 134], [50, 54], 'k-', linewidth=1.5, transform=ccrs.PlateCarree())
ax.plot([134, 133], [53, 52], 'k-', linewidth=1.5, transform=ccrs.PlateCarree())
ax.plot([134, 135], [53, 52], 'k-', linewidth=1.5, transform=ccrs.PlateCarree())
# 添加图例说明
ax.text(0.01, 0.01, '数据来源: Natural Earth & Cartopy',
transform=ax.transAxes, fontsize=10, color='gray')
# 添加九段线(南海诸岛)
nine_dash_line = [
(108, 5), (112, 7), (116, 9), (120, 11), (124, 13),
(118, 15), (114, 13), (110, 11), (106, 9), (108, 5)
]
lons, lats = zip(*nine_dash_line)
ax.plot(lons, lats, 'k--', transform=ccrs.PlateCarree(), linewidth=1.5)
plt.subplots_adjust(top=0.92) # 为标题留出空间
# 保存和显示
plt.tight_layout()
plt.savefig('china_cities_map_cartopy.png', dpi=300, bbox_inches='tight')
plt.show()
《Python实战进阶》No16: Plotly 交互式图表制作指南-CSDN博客https://blog.csdn.net/yweng18/article/details/146125263
作用类别 | 具体作用描述 | 带来的价值 |
---|---|---|
深入数据探索 | 允许用户缩放、平移、聚焦特定数据范围或区域。 | 揭示宏观趋势下的微观细节,避免信息过载。 |
支持数据点的悬停查看详细信息(Tooltips)。 | 无需离开图表即可获取精确数值、标签等关键信息。 | |
动态数据筛选 | 提供下拉菜单、滑块、复选框、时间轴等控件进行维度、度量或时间范围的筛选。 | 用户可快速聚焦于感兴趣的数据子集,进行对比分析或排除干扰因素。 |
多维数据钻取 | 点击图表元素(如柱形图中的柱子、地图中的区域)钻取到更细粒度的数据层次。 | 实现从汇总数据到明细数据的无缝切换,理解数据构成的来源。 |
数据关联联动 | 一个图表中的交互操作(如选择、筛选)自动更新页面上的其他关联图表或数据表格。 | 展示数据不同侧面之间的关联性,提供全局视角,避免信息孤岛。 |
即时计算反馈 | 用户选择数据后,图表能动态展示基于选择的相关计算(如占比、平均值、差值等)。 | 快速获得衍生指标和洞察,无需手动计算或切换视图。 |
提升参与理解 | 用户不再是数据的被动接受者,而是主动参与者。 | 增强用户对数据的兴趣、记忆和理解深度,提升分析报告的吸引力和说服力。 |
灵活适配需求 | 用户可以根据自己的分析路径和疑问定制视图。 | 满足不同背景、不同目标用户的个性化分析需求,提高工具的普适性和用户满意度。 |
应用领域 | 典型场景 | 常用交互功能示例 |
---|---|---|
商业智能(BI)与报表 | 销售仪表盘、财务分析报告、运营监控看板、市场表现分析。 | 日期范围选择器、区域/产品线筛选器、图表联动钻取、指标切换、趋势线开关、数据导出。 |
数据可视化平台 | Tableau, Power BI, Qlik Sense, Looker, Superset等平台的核心功能。 | 丰富的控件(筛选器、参数)、跨视图联动、即席探索(拖拽字段)、书签/故事分享。 |
大屏数据监控 | 指挥中心、工厂生产监控、网络运营中心(NOC)、交易大厅实时看板。 | 自动刷新、关键指标突出显示(阈值告警)、地图区域钻取、时间轴播放、实时数据流展示。 (强调实时性与关键信息突出) |
地理空间分析 | 人口分布热力图、门店选址分析、物流路径优化、疫情传播追踪、区域销售业绩地图。 | 地图缩放平移、区域选择/高亮、图层切换(点/热力/区域)、地图标记点信息悬停、路径绘制与测量。 |
科学研究与工程 | 复杂模型结果可视化(流体力学、分子结构)、实验数据分析、传感器网络监控、大规模仿真结果探索。 | 3D模型旋转缩放、参数调节滑块实时更新图表、数据切片查看、多变量对比切换、动画播放模拟过程。 |
金融分析 | 股票行情分析(K线图)、投资组合分析、风险管理仪表盘、宏观经济指标趋势分析。 | 时间范围缩放(分钟/日/月/年)、技术指标叠加/开关、多股对比、交易量联动、钻取到明细交易数据。 |
网络与数字分析 | 网站流量分析(用户行为路径、来源渠道)、APP用户行为分析、社交媒体舆情监控、广告效果分析。 | 用户细分筛选、行为路径图点击钻取、转化漏斗步骤分析、时间对比、维度下钻(设备/地域)。 |
公共数据开放 | 政府开放数据平台、统计年鉴在线版、环境监测数据发布、公共卫生数据查询。 | 多维度筛选(年份、地区、指标)、图表类型切换、数据下载、简单对比功能。 |
教育与演示 | 交互式教材、动态演示文稿、在线数据素养课程。 | 步骤引导式探索、参数调节观察变化、知识点的动态图解、测验反馈与图表更新。 |
技术类别 | 代表工具/库 | 特点与适用场景 |
---|---|---|
专业BI/可视化工具 | Tableau, Power BI, Qlik Sense, Looker, Google Data Studio, Superset, Metabase | 开箱即用,提供丰富的可视化类型和强大的交互控件(筛选器、参数、联动、钻取),适合快速构建复杂仪表盘和报表,用户友好,学习曲线相对平缓。 |
JavaScript 可视化库 | D3.js, ECharts, Highcharts, Chart.js, Plotly.js, Apache ECharts, Leaflet (地图) | 高度灵活与定制化。D3.js功能最强大但学习曲线陡峭;ECharts/Highcharts等提供丰富图表类型和交互API,适合前端开发人员嵌入Web应用。Plotly.js支持3D和科学图表。 |
Python 数据科学生态 | Plotly (Python), Bokeh, Dash (基于Plotly), Panel, Altair/Vega-Lite | 在Jupyter Notebook或构建Web应用中创建交互图表。Dash/Panel专注于构建交互式数据应用仪表盘。适合数据科学家和Python开发者。 |
R 语言生态 | Shiny, Plotly (R), ggplot2 (扩展交互) | Shiny框架是R语言构建交互式Web应用的强大工具。Plotly for R可将ggplot2静态图转为交互式。适合统计学家和R用户。 |
Web框架集成 | 在React, Vue, Angular等框架中使用上述JS库 (ECharts, D3, Highcharts组件) | 与现代前端框架深度集成,构建复杂单页面应用(SPA)中的交互式数据可视化模块。 |
地图专用库 | Leaflet, Mapbox GL JS, OpenLayers, Cesium (3D) | 专注于构建交互式Web地图,提供丰富的图层控制、标记、弹出窗口、绘制、地理搜索等交互功能。 |
go.Figure()
是 Plotly 库(特别是 plotly.graph_objects
模块)的核心类,用于创建高度可定制、交互式的数据可视化图表。
go.Figure
:表示一个完整的图表对象,包含 数据(Traces)、布局(Layout) 和 框架(Frames,用于动画)。
Traces:实际绘制的图形元素(如散点图、柱状图、热力图等)。
Layout:控制图表外观(标题、坐标轴、图例、注释等)。
Frames:用于创建动画的帧序列。
Traces
类型 | 描述 | 示例 |
---|---|---|
go.Scatter |
散点图/线图 | mode="lines+markers" |
go.Bar |
柱状图 | x=["A","B"], y=[1,2] |
go.Histogram |
直方图 | x=data, nbinsx=20 |
go.Pie |
饼图 | labels=..., values=... |
go.Heatmap |
热力图 | z=[[1,2],[3,4]] |
go.Box |
箱线图 | y=data, name="Group1" |
Layout
layout = go.Layout(
title="Chart Title", # 标题
width=800, height=500, # 尺寸
margin=dict(l=50, r=50), # 边距
font=dict(family="Arial"),# 字体
hovermode="x unified", # 悬停模式
showlegend=True, # 显示图例
xaxis=dict(...), # 单独设置 X 轴
yaxis=dict(...), # 单独设置 Y 轴
)
import plotly.graph_objects as go
import numpy as np
# 创建示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 创建图表对象
fig = go.Figure()
# 添加折线图
fig.add_trace(go.Scatter(
x=x,
y=y,
mode='lines',
name='正弦波',
line=dict(color='royalblue', width=3)
))
# 添加关键点标记
max_point = (5*np.pi/2, 1)
min_point = (3*np.pi/2, -1)
fig.add_trace(go.Scatter(
x=[max_point[0], min_point[0]],
y=[max_point[1], min_point[1]],
mode='markers',
marker=dict(size=12, color='red'),
name='关键点'
))
# 添加注解
fig.add_annotation(
x=max_point[0],
y=max_point[1],
text="最大值点",
showarrow=True,
arrowhead=3,
ax=-50,
ay=-40,
font=dict(size=14, color="black"),
bgcolor="white",
bordercolor="black",
borderwidth=1
)
fig.add_annotation(
x=min_point[0],
y=min_point[1],
text="最小值点",
showarrow=True,
arrowhead=3,
ax=50,
ay=40,
font=dict(size=14, color="black"),
bgcolor="white",
bordercolor="black",
borderwidth=1
)
# 添加水平参考线
fig.add_hline(y=0, line_dash="dash", line_color="gray")
# 添加标题和坐标轴标签
fig.update_layout(
title='交互式正弦波图表 (带注解)',
xaxis_title='X轴',
yaxis_title='Y轴',
showlegend=True,
template='plotly_white',
hovermode='x unified'
)
# 保存为交互式HTML文件
fig.write_html("interactive_sine_wave.html")
# 保存为静态图片(需要安装kaleido)
fig.write_image("static_sine_wave.png", scale=2)
print("图表已保存为:")
print("1. 交互式HTML: interactive_sine_wave.html")
print("2. 静态PNG图片: static_sine_wave.png")
Python之networkx绘制网络图_python画网络图-CSDN博客https://blog.csdn.net/Yhw20040823/article/details/141205640
作用类别 | 具体作用描述 | 典型实现场景举例 | 典型工具/平台示例 |
---|---|---|---|
可视化复杂关系 | 直观展示实体(节点)之间的连接(边)模式和结构。 | * 社交网络分析: 展示用户之间的好友关系、关注关系。 * 组织结构图: 展示公司部门、员工间的汇报关系。 * 论文引用网络: 展示学术论文之间的引用关系。 * 知识图谱: 可视化概念、实体及其语义关系。 |
Gephi, Cytoscape, NetworkX, D3.js, Neo4j Bloom |
揭示结构与模式 | 识别网络中的关键结构特征,如社群/社区、中心节点、桥节点、隔离节点、层级结构等。 | * 社群发现: 在社交网络或协作网络中识别关系紧密的群体(社区)。 * 关键节点识别: 找出信息传播中的意见领袖(社交网络)、交通枢纽(交通网络)、关键蛋白质(生物网络)。 * 层级分析: 分析组织结构或知识体系中的层级关系。 |
Gephi, Cytoscape, igraph, NetworkX |
路径与连通性分析 | 分析节点间的最短路径、连通性、信息/资源流动的效率与瓶颈。 | * 路由优化: 在网络基础设施(互联网、交通)中寻找最优路径。 * 影响力传播模拟: 模拟信息、疾病或创新在社交网络中的传播路径和范围。 * 依赖分析: 分析IT系统组件或供应链中的依赖关系和故障传播风险。 |
NetworkX, igraph, Neo4j, 专用路由/仿真软件 |
模式识别与洞察 | 发现隐藏的模式、异常点、潜在关系或趋势。 | * 欺诈检测: 识别金融交易网络中异常的关联模式(如洗钱)。 * 推荐系统: 基于用户-物品交互网络或用户相似性网络进行推荐。 * 科研合作分析: 发现跨学科或新兴的合作趋势。 * 生物网络分析: 识别基因调控网络或蛋白质相互作用网络中的功能模块或关键通路。 |
Neo4j, TigerGraph, NetworkX, 机器学习框架 + 可视化库 |
简化复杂性 | 将大规模、高维度的关系数据抽象为更易于理解和沟通的图形表示。 | * 系统架构图: 简化展示复杂软件系统或IT基础设施的组件及其交互。 * 项目管理: 可视化任务依赖关系(关键路径法)。 * 概念图/思维导图: 组织和展示想法、知识点之间的关联。 |
Lucidchart, Miro, Draw.io, yEd |
动态演变分析 | 展示网络结构随时间的变化,揭示演化趋势和关键事件的影响。 | * 社交网络演化: 观察社群形成、用户关系变化。 * 引文网络增长: 追踪学科领域知识结构的发展。 * 疾病传播追踪: 可视化疫情传播路径和范围的变化。 |
Gephi (动态插件), D3.js (动画), 定制开发 |
draw_networkx_nodes(G, pos, **kwargs)
功能:绘制网络图中的节点
核心参数:
G
:NetworkX图对象
pos
:节点位置字典(例如通过spring_layout等布局算法生成)
nodelist
:要绘制的节点列表(默认为所有节点)
node_size
:节点大小(默认为300)
node_color
:节点颜色(默认为红色'r')
node_shape
:节点形状(默认为圆形'o')
alpha
:透明度(0-1)
linewidths
:节点边界宽度
edgecolors
:节点边界颜色
draw_networkx_edges(G, pos, **kwargs)
功能:绘制网络图中的边
核心参数:
G
:NetworkX图对象
pos
:节点位置字典
edgelist
:要绘制的边列表(默认为所有边)
width
:边宽度(默认为1.0)
edge_color
:边颜色(默认为黑色'k')
style
:边样式(默认为实线'-')
alpha
:透明度(0-1)
arrowstyle
:箭头样式(有向图)
arrows
:是否显示箭头(有向图)
connectionstyle
:连接样式(如弧线)
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
# 创建有向图
G = nx.DiGraph()
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统
# plt.rcParams['font.sans-serif'] = ['Songti SC'] # Mac系统
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 添加节点(城市)
cities = ["北京", "上海", "广州", "深圳", "杭州", "成都", "武汉", "西安", "南京", "重庆"]
G.add_nodes_from(cities)
# 添加边(城市间的连接关系)
connections = [
("北京", "上海", 1200),
("北京", "广州", 2100),
("北京", "成都", 1500),
("上海", "杭州", 180),
("上海", "南京", 300),
("广州", "深圳", 140),
("广州", "武汉", 900),
("深圳", "重庆", 1200),
("杭州", "南京", 280),
("成都", "重庆", 310),
("武汉", "南京", 500),
("武汉", "西安", 700),
("西安", "重庆", 650),
("南京", "重庆", 1250)
]
for start, end, distance in connections:
G.add_edge(start, end, weight=distance)
# 设置节点位置(使用环形布局)
pos = nx.circular_layout(G)
# 创建图形
plt.figure(figsize=(12, 10), facecolor='#f0f8ff')
plt.title("中国主要城市交通网络图", fontsize=16, fontweight='bold', pad=20)
# 绘制节点
node_colors = plt.cm.tab20(np.linspace(0, 1, len(cities)))
nx.draw_networkx_nodes(G, pos, node_size=1800, node_color=node_colors, edgecolors='black', alpha=0.9)
# 绘制边
edge_colors = [G[u][v]['weight'] for u, v in G.edges()]
edge_widths = [G[u][v]['weight']/300 for u, v in G.edges()]
nx.draw_networkx_edges(
G, pos, edge_color=edge_colors,
edge_cmap=plt.cm.autumn, width=edge_widths,
alpha=0.7, arrowstyle='->', arrowsize=15
)
# 添加节点标签
nx.draw_networkx_labels(G, pos, font_size=10, font_family='SimHei', font_weight='bold')
# 添加边标签(距离)
edge_labels = {(u, v): f"{d['weight']}km" for u, v, d in G.edges(data=True)}
nx.draw_networkx_edge_labels(
G, pos, edge_labels=edge_labels,
font_size=8, font_color='#006400',
bbox=dict(alpha=0.7, boxstyle="round", facecolor='white', edgecolor='none')
)
# 添加注解
plt.annotate("首都", xy=pos["北京"], xytext=(pos["北京"][0]-0.1, pos["北京"][1]+0.1),
arrowprops=dict(arrowstyle="fancy", color='#8B4513', connectionstyle="arc3,rad=0.2"),
bbox=dict(boxstyle="round", facecolor='#FFFACD', alpha=0.8), fontsize=10)
plt.annotate("经济中心", xy=pos["上海"], xytext=(pos["上海"][0]+0.05, pos["上海"][1]+0.15),
arrowprops=dict(arrowstyle="->", color='#8B4513', connectionstyle="arc3,rad=-0.2"),
bbox=dict(boxstyle="round", facecolor='#FFFACD', alpha=0.8), fontsize=10)
plt.annotate("最短距离: 140km", xy=pos["广州"], xytext=(pos["广州"][0]-0.3, pos["广州"][1]-0.2),
arrowprops=dict(arrowstyle="wedge", color='#006400', connectionstyle="arc3,rad=-0.2"),
bbox=dict(boxstyle="round", facecolor='#90EE90', alpha=0.7), fontsize=9)
plt.annotate("最长距离: 2100km", xy=pos["北京"], xytext=(pos["北京"][0]-0.4, pos["北京"][1]-0.2),
arrowprops=dict(arrowstyle="wedge", color='#8B0000', connectionstyle="arc3,rad=0.3"),
bbox=dict(boxstyle="round", facecolor='#FFB6C1', alpha=0.7), fontsize=9)
# 添加图例说明
plt.figtext(0.5, 0.01,
"说明: 箭头方向表示交通方向 | 线宽表示距离远近 | 线色表示距离长短(红远绿近)",
ha="center", fontsize=10, bbox=dict(facecolor='#F5F5F5', alpha=0.5))
# 添加色标说明
cbar = plt.colorbar(plt.cm.ScalarMappable(cmap=plt.cm.autumn), ax=plt.gca(), shrink=0.7)
cbar.set_label('距离 (km)', fontsize=10)
# 添加网格
plt.grid(True, linestyle='--', alpha=0.2)
# 保存图片
plt.savefig("china_city_network.png", dpi=300, bbox_inches='tight')
# 显示图形
plt.tight_layout()
plt.show()