Python绘图库及图像类型之高级可视化
Python绘图库及图像类型之基础图表-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/148433762?spm=1001.2014.3001.5501
热力图(heatmap)
绘图库介绍
用 Python 绘制热力图(Heatmap)详解:从数据到可视化全流程(第三天)_python heatmap-CSDN博客https://blog.csdn.net/2401_84301183/article/details/146536553
类别 | 具体作用/场景 | 说明/示例 |
---|---|---|
核心作用 | 直观展示数据密度/强度分布 | 用颜色深浅(暖色表高值,冷色表低值)快速揭示数据集中高低值区域及分布模式。 |
揭示模式、趋势和异常 | 识别热点(高值聚集)、冷点(低值聚集)、梯度变化、异常值。 | |
高效比较多变量/类别间关系 | 矩阵热力图中通过颜色比较行、列代表的类别/变量间关系强度(如相关性、频率)。 | |
简化高维数据表达 | 将二维(如坐标+值)或三维(如行类+列类+值)数据压缩到平面视图,用颜色编码。 | |
空间效率高 | 在有限空间内展示大量数据点或关系对比,优于重叠散点图或多条形图。 | |
主要实现场景 | 地理空间数据分析 (Geospatial) | 应用领域: 人口、犯罪、交通、房产、疾病、天气、商业选址等。 示例: 人口密度图、交通拥堵热图、疫情分布图、商场客流量热图。 |
网站和用户行为分析 (Web & UX) | 应用领域: 网页/App设计优化、用户体验研究。 示例: 点击热图(分析按钮点击)、滚动热图(分析页面浏览深度)、鼠标移动热图(分析浏览路径)、眼动追踪热图(分析视觉焦点)。 | |
数据分析和统计学 (Data Analysis & Statistics) | 应用领域: 探索性数据分析、模型评估、关系挖掘。 示例: 相关性矩阵(展示变量间相关系数)、混淆矩阵(评估分类模型性能)、缺失值模式热图、聚类结果热图(展示基因表达模式等)。 |
函数签名(Function Signature)
# 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点# 创建DataFramedf = 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}")
小提琴图(violinplot)
绘图库介绍
用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. 识别数据子群或潜在分段。 | 揭示隐藏信息:能提示数据背后可能存在的未考虑因素或分组。 |
函数签名(Function Signature)
# 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.hstacknp.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")
3D曲面图(plot_surface)
绘图库介绍
Python绘制3D曲面图-CSDN博客https://blog.csdn.net/weixin_41923961/article/details/83998917
维度 | 描述 | 典型实现场景 |
---|---|---|
核心作用 | 可视化三维空间中的连续表面 | 理解复杂数学函数、物理现象的空间分布。 |
揭示变量间的非线性关系 | 分析两个自变量(X, Y)对因变量(Z)的共同影响(尤其非线性关系)。 | |
展示空间数据的分布、趋势和模式 | 地理高程、物理场(温度/压力/电势)、浓度分布的空间变化。 | |
识别关键特征点(峰值、谷值、鞍点) | 定位最大值、最小值、转折点或急剧变化区域。 | |
实现场景 | 数学与函数可视化 | 绘制二元函数图像(如 Z = sin(X²+Y²) ),分析函数形状。 |
地理信息系统 | 地形图、数字高程模型、坡度分析、洪水模拟。 | |
物理学与工程学 | • 电磁场:电势/磁场分布 • 力学:应力分布、振动模态 • 流体力学:流速/压力场 • 热力学:温度场分布 | |
化学与材料科学 | • 分子建模:电子云密度、势能面 • 材料表征:表面粗糙度、成分浓度分布 | |
气象与海洋学 | • 气象:大气压力/温度场 • 海洋:海水温度/盐度垂直剖面 | |
医学与生物科学 | • 医学:器官3D重建(CT/MRI) • 生物学:蛋白质结构表面、药物扩散模拟 | |
计算机图形学 | 渲染复杂3D模型表面(如游戏场景、角色) | |
数据分析 | • 优化算法:损失函数曲面 • 响应面分析:多变量对输出的影响 |
函数签名(Function Signature)
# 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()
地理地图(figure)
绘图库介绍
Python绘制地图神器folium介绍及安装使用教程-CSDN博客https://blog.csdn.net/python2021_/article/details/123652555
作用类别 | 具体作用描述 | 典型实现场景举例 | 核心价值 |
---|---|---|---|
空间认知与定位 | 提供地球表面或特定区域的空间位置、形状、大小、方向等基础地理信息。 | * 日常生活导航: 手机地图APP(如百度、高德、Google Maps)查找地点、规划路线。 * 位置查询: 查找酒店、餐厅、景点、加油站等POI(兴趣点)的位置。 * 区域概览: 查看国家、省、市、县、乡镇的行政边界和范围。 | 建立空间框架,理解“在哪里”。 |
空间关系展示 | 可视化地展示地理要素(点、线、面)之间的空间关系(邻近、包含、相交、叠加等)。 | * 城市规划: 展示道路网、建筑地块、绿地、水系的空间布局关系。 * 设施选址: 分析候选位置与现有设施(如学校、医院、竞争对手)、人口分布、交通可达性的关系。 * 环境监测: 显示污染源、监测点、敏感区域(如水源地)的空间分布与距离关系。 | 揭示地理要素间的相互联系和格局。 |
空间分布可视化 | 将具有空间位置的数据(人口、经济、环境、事件等)以图形方式直观呈现其分布特征。 | * 人口密度图: 展示不同区域的人口集中程度。 * 疾病分布图: 追踪流行病或地方病的空间传播。 * 经济活动图: 显示GDP、产业分布、消费水平的地域差异。 * 犯罪热点图: 识别案件高发区域。 * 气象云图: 展示温度、降水、气压等的空间分布。 | 直观揭示数据的空间模式、聚集性、热点/冷点区域和地域差异。 |
导航与路径规划 | 提供从一个地点到另一个地点的最佳或可行路径指导。 | * 驾车导航: 实时规划避开拥堵、收费少、时间短的驾驶路线。 * 公共交通导航: 规划包含公交、地铁、步行等多种方式的换乘方案。 * 步行/骑行导航: 提供适合行人和骑手的路径。 * 物流配送: 优化快递、外卖的配送路线和顺序。 | 提供高效的移动解决方案,节省时间和成本。 |
空间分析与决策 | 基于地图进行复杂的空间运算和建模,提取信息、发现规律、预测趋势、支持决策。 | * 选址分析: 综合交通、人口、竞争、成本等因素确定最优开店/建厂位置。 * 视域分析: 规划监控摄像头覆盖范围或景区观景点视野范围。 * 缓冲区分析: 确定污染源影响范围、划定保护区边界。 * 叠加分析: 将不同图层(如土壤类型、坡度、土地利用)叠加,评估土地适宜性(如农业、建设)。 * 网络分析: 计算服务覆盖范围(如消防站、急救中心)、寻找最近设施。 | 将空间数据转化为洞察力,为科学决策提供定量依据。 |
资源管理与规划 | 用于监测、评估、规划和可持续管理自然资源和人文资源。 | * 土地资源管理: 土地调查、地籍管理、土地利用规划与变更监测。 * 森林资源管理: 森林覆盖监测、火灾预警、采伐规划。 * 水资源管理: 流域规划、水质监测、洪水淹没模拟与风险评估。 * 城市规划: 城市扩张模拟、基础设施规划(道路、管线)、公共服务设施布局优化。 * 农业精准管理: 农田地块划分、作物长势监测、变量施肥/灌溉指导。 | 优化资源配置,提高管理效率,促进可持续发展。 |
灾害监测与应急响应 | 用于灾害风险评估、实时监测、预警发布、灾情评估和应急资源调度。 | * 风险评估: 绘制地震带、洪水淹没区、滑坡隐患点地图。 * 实时监测: 利用卫星/无人机影像监测火灾、洪涝、台风路径。 * 灾情评估: 快速获取受灾范围、损毁程度。 * 应急指挥: 定位受灾点、规划救援路线、调度救援力量和物资。 | 提升灾害预警能力,加速应急响应,减少生命财产损失。 |
历史变迁与趋势研究 | 通过不同时期地图的对比,展示地理环境、城市形态、土地利用等的历史变化和发展趋势。 | * 城市历史地图: 展示城市扩张、街区演变。 * 海岸线变化图: 监测侵蚀或淤积。 * 土地利用变化图: 分析耕地、林地、建设用地的转化。 * 气候变化研究: 可视化冰川退缩、海平面上升等长期变化。 | 理解过去,洞察变化规律,预测未来发展趋势。 |
教育与科普 | 作为教学和科普的重要工具,直观展示地理知识、国家疆域、自然人文现象。 | * 课堂教学: 地理、历史、环境科学等课程的教学辅助。 * 博物馆/科技馆: 互动地图展示地理、历史、科技知识。 * 旅游宣传: 景区手绘地图、电子导览图。 * 国家版图意识教育: 准确展示国家领土和边界。 | 形象直观,激发兴趣,传播知识,增强空间认知和爱国意识。 |
军事与国防 | 提供战场环境信息、部署态势、行动规划和作战指挥支持(保密性强)。 | * 地形分析: 研究战场地形、地貌、交通条件。 * 态势标绘: 显示敌我双方部署和行动。 * 精确制导: 为武器系统提供精确地理坐标。 * 军事演习规划: 模拟推演和行动计划制定。 | 提供关键战场空间信息,支持战略战术决策(高度专业化应用)。 |
函数签名(Function Signature)
# 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 cfeatureax.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, -1elif city == '拉萨':offset_x, offset_y = -3, -0.5elif city == '乌鲁木齐':offset_x, offset_y = -4, 0elif city == '哈尔滨':offset_x, offset_y = -1, 1elif 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()
交互式图表(Plotly.graph_objects)
《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
模块)的核心类,用于创建高度可定制、交互式的数据可视化图表。
函数签名(Function Signature)
-
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")
网络图(draw_networkx_nodes/draw_networkx_edges)
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 (动画), 定制开发 |
绘图库介绍
函数签名(Function Signature)
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()