目录
一、我们为什么要去学习python可视化?
二、为什么用气象数据?
真实项目里怎么更新数据?
三、如何选图:先读表,再想问题
四、matplotlib 基础
四步画图模板
五、八种常用图表详解
5.1 折线图(Line Plot)— 看趋势
5.2 柱状图(Bar Chart)— 做对比
5.3 散点图(Scatter Plot)— 看关系
5.4 直方图(Histogram)— 看分布
5.5 箱线图(Box Plot)— 看分布 + 异常值
5.6 双轴组合图 — 多指标同屏
5.7 饼图(Pie Chart)— 看占比
5.8 热力图(Heatmap)— 看矩阵/强度
六、可视化与机器学习的关系
一、我们为什么要去学习python可视化?
机器学习不只有公式和代码,还需要把数据「画」出来。一张好图胜过千言万语——但前提是:你知道这张图要回答什么问题。
本篇用气象数据把八种常用图表练一遍,让你在建模前就能系统做EDA(探索性数据分析)。
数据可视化用图形表达数据规律,帮助我们:
- 探索数据:训练模型前先看分布、缺失、异常
- 展示结果:向他人解释模型、汇报分析结论
- 监控业务:网站后台的实时曲线、柱状 KPI
本教程用南京市 2024 年每日气象数据(真实 API 数据)练习matplotlib八种常用图表。
二、为什么用气象数据?
选熟悉、能判断对错的数据,后面八种图才有直觉。气温人人懂,画错了你一眼能发现。
我们都知道:生活中天天接触
天气预报、穿衣指数、出行计划——气温、降水人人都懂,看图时容易判断「画得对不对」。
真实项目里怎么更新数据?
| 场景 | 做法 |
|---|---|
| 天气 App / 网站 | 定时调用气象 API(如 Open-Meteo、和风天气),每小时或每天刷新 |
| 数据大屏 | 后端拉 API → 存数据库 → 前端 ECharts 轮询展示 |
| 本教程 | 已下载 2024 年全年历史数据到 CSV,离线学习,逻辑与线上一致 |
三、如何选图:先读表,再想问题
画图之前,先对着 CSV 问自己两个个问题——后面选图就不会乱。
| 你想知道什么 | 我该画什么图 |
|---|---|
| 一年里气温怎么变? | 折线图 |
| 哪个月最热/最冷? | 柱状图 |
| 最高温和最低温有关系吗? | 散点图 |
| 气温大多集中在哪一段? | 直方图 |
| 各月气温分布差多少、有无异常天? | 箱线图 |
| 气温和降水能放一张图吗? | 双轴组合图 |
| 晴天多还是雨天多? | 饼图 |
| 12 个月温度强弱一眼看清? | 热力图 |
文件:数据集/nanjing_weather_2024.csv
| 列名 | 含义 | 单位 |
|---|---|---|
date | 日期 | YYYY-MM-DD |
temp_max | 日最高气温 | °C |
temp_min | 日最低气温 | °C |
temp_mean | 日平均气温 | °C |
precipitation_mm | 日降水量 | mm |
wind_max_kmh | 日最大风速 | km/h |
加载代码(可视化分析.py→load_data()):
def load_data(path: str = DATA_PATH) -> pd.DataFrame: df = pd.read_csv(path, parse_dates=["date"]) df["month"] = df["date"].dt.month df["day_of_year"] = df["date"].dt.dayofyear return df四、matplotlib 基础
四步画图模板
import matplotlib.pyplot as plt plt.figure(figsize=(宽, 高)) # 1. 创建画布 plt.plot(x, y) # 2. 画某种图 plt.xlabel("横轴"); plt.ylabel("纵轴"); plt.title("标题") # 3. 标注 plt.savefig("图片/xxx.png") # 4a. 保存 plt.show() # 4b. 弹窗显示中文显示
plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei"] plt.rcParams["axes.unicode_minus"] = False # 负号正常显示五、八种常用图表详解
每种图:先问什么问题 → 怎么画 → 对应哪张图 → 机器学习里何时用。
折线图(整体趋势) → 柱状图(按月对比) → 散点图(两变量关系) → 直方图(单变量分布) → 箱线图(多组分布 + 异常) → 双轴图(不同量纲同屏) → 饼图(占比) → 热力图(矩阵强度)5.1 折线图(Line Plot)— 看趋势
第一个问题:2024 年南京气温随时间怎么变?
用途:气温随时间变化、股票走势、网站 UV 曲线、训练损失随 epoch 变化——连续/有序数据看趋势的首选。
本教程:2024 年每日平均气温 + 最高最低填充带。
代码(可视化分析.py→plot_line_daily_temp()):
def plot_line_daily_temp(df, filename="01_折线图_日均气温趋势.png"): plt.figure(figsize=(12, 5)) plt.plot(df["date"], df["temp_mean"], color="crimson", linewidth=0.9, label="日均气温") plt.fill_between(df["date"], df["temp_min"], df["temp_max"], alpha=0.15, color="crimson") plt.xlabel("日期") plt.ylabel("气温 (°C)") plt.title(f"{CITY}市 {YEAR} 年每日气温变化(折线图)") plt.legend() plt.grid(True, alpha=0.3) plt.tight_layout() save_and_show(filename)何时用:X 轴是时间或有序序列,关心「怎么变」。
机器学习里:损失曲线、准确率曲线、学习率调度
5.2 柱状图(Bar Chart)— 做对比
承接 5.1:折线图信息太细;按月聚合后比高低,柱状图更直观。
用途:各月销售额、各城市 PM2.5、班级人数——分类之间比大小。
本教程:12 个月的平均气温,颜色随温度冷暖变化(coolwarm色图)。
代码(可视化分析.py→plot_bar_monthly_avg()):
def plot_bar_monthly_avg(df, filename="02_柱状图_月均气温.png"): monthly = df.groupby("month")["temp_mean"].mean() colors = plt.cm.coolwarm((monthly - monthly.min()) / (monthly.max() - monthly.min())) plt.figure(figsize=(10, 5)) plt.bar(MONTH_LABELS, monthly.values, color=colors, edgecolor="gray", linewidth=0.5) plt.xlabel("月份") plt.ylabel("平均气温 (°C)") plt.title(f"{CITY}市 {YEAR} 年各月平均气温(柱状图)") plt.grid(True, alpha=0.3, axis="y") plt.tight_layout() save_and_show(filename)何时用:X 轴是离散类别(月份、城市、产品)。
机器学习里:各类别样本数量、特征重要性排序、各模型准确率对比。
5.3 散点图(Scatter Plot)— 看关系
承接 5.2:柱状图比的是「汇总后的类别」;散点图看两个数值变量是否相关、有没有离群点。
用途:身高 vs 体重、广告投入 vs 销量、房屋面积 vs 房价——观察两个变量是否相关。
本篇:每日最低温 vs 最高温,颜色表示月份。
代码(可视化分析.py→plot_scatter_max_min()):
def plot_scatter_max_min(df, filename="03_散点图_最高与最低气温.png"): plt.figure(figsize=(7, 6)) plt.scatter(df["temp_min"], df["temp_max"], c=df["month"], cmap="coolwarm", s=18, alpha=0.7, edgecolors="none") plt.xlabel("日最低气温 (°C)") plt.ylabel("日最高气温 (°C)") plt.title(f"{CITY}市 {YEAR} 年 最高温 vs 最低温(散点图)") plt.grid(True, alpha=0.3) plt.tight_layout() save_and_show(filename)何时用:两个数值变量,想看相关性、聚类、离群点。
机器学习里:线性回归前必画特征与标签关系。
5.4 直方图(Histogram)— 看分布
承接 5.3:散点看的是「两个变量」;直方图只看一个变量落在各区间的频率。
用途:成绩分布、用户年龄分布——一个变量落在各区间的频率。
本教程:366 天日均气温落在各温度区间的天数。
代码(可视化分析.py→plot_histogram_temp()):
def plot_histogram_temp(df, filename="04_直方图_气温分布.png"): plt.figure(figsize=(8, 5)) plt.hist(df["temp_mean"], bins=20, color="steelblue", edgecolor="white", alpha=0.85) plt.axvline(df["temp_mean"].mean(), color="crimson", linestyle="--", linewidth=2, label=f'年均 {df["temp_mean"].mean():.1f}°C') plt.xlabel("日均气温 (°C)") plt.ylabel("天数") plt.title(f"{CITY}市 {YEAR} 年日均气温分布(直方图)") plt.legend() plt.grid(True, alpha=0.3, axis="y") plt.tight_layout() save_and_show(filename)何时用:关心「数据集中在哪一段」;机器学习里常用来检查特征分布是否偏态、是否需要标准化。
5.5 箱线图(Box Plot)— 看分布 + 异常值
承接 5.4:直方图是一个整体分布;箱线图适合多组并排比较(这里是 12 个月)。
用途:多组数据对比分布:中位数、四分位、异常点一目了然。
本教程:12 个月各自的日均气温箱线。
代码(可视化分析.py→plot_box_monthly()):
def plot_box_monthly(df, filename="05_箱线图_各月气温分布.png"): data_by_month = [df.loc[df["month"] == m, "temp_mean"].values for m in range(1, 13)] plt.figure(figsize=(11, 5)) bp = plt.boxplot(data_by_month, tick_labels=MONTH_LABELS, patch_artist=True) plt.xlabel("月份") plt.ylabel("日均气温 (°C)") plt.title(f"{CITY}市 {YEAR} 年各月气温分布(箱线图)") plt.grid(True, alpha=0.3, axis="y") plt.tight_layout() save_and_show(filename)箱线图读法:
| 部分 | 含义 |
|---|---|
| 中间线 | 中位数 |
| 箱子 | 25%~75% 分位(IQR) |
| 须 | 正常范围 |
| 圆点 | 异常值 |
机器学习里:按类别看特征分布、发现标注异常;数据清洗前常用。
5.6 双轴组合图 — 多指标同屏
承接 5.5:箱线图是「分组对比」;双轴图是「同一时间轴、两种量纲」——气象网站最常见。
用途:气象网站常见:气温折线 + 降水柱状画在同一张图。
代码(可视化分析.py→plot_temp_precipitation()):
def plot_temp_precipitation(df, filename="06_组合图_气温与降水量.png"): fig, ax1 = plt.subplots(figsize=(12, 5)) ax1.plot(df["date"], df["temp_mean"], color="crimson", linewidth=0.9, label="日均气温") ax1.set_xlabel("日期") ax1.set_ylabel("气温 (°C)", color="crimson") ax2 = ax1.twinx() # 创建右轴 ax2.bar(df["date"], df["precipitation_mm"], width=1.0, color="steelblue", alpha=0.35) ax2.set_ylabel("降水量 (mm)", color="steelblue") fig.suptitle(f"{CITY}市 {YEAR} 年 气温与降水量(双轴组合图)") fig.tight_layout() save_and_show(filename)何时用:两个量纲不同的指标要放在同一时间轴上对比。
机器学习里:同时监控训练损失与验证损失、学习率与梯度范数。
5.7 饼图(Pie Chart)— 看占比
承接 5.6:双轴图仍是时间序列;饼图回答「整体里各部分占多少」。
用途:市场份额、预算分配——部分占整体的比例(类别不宜超过 5~7 个)。
本教程:2024 年上海有降水天数 vs 无降水天数。
代码(可视化分析.py→plot_pie_rainy_days()):
def plot_pie_rainy_days(df, filename="07_饼图_晴雨天天数占比.png"): rainy = (df["precipitation_mm"] > 0).sum() dry = len(df) - rainy plt.figure(figsize=(6, 6)) plt.pie( [dry, rainy], labels=[f"晴天/无降水\n{dry} 天", f"有降水\n{rainy} 天"], autopct="%1.1f%%", colors=["#FFD966", "#6FA8DC"], startangle=90, ) plt.title(f"{CITY}市 {YEAR} 年 晴雨天天数占比(饼图)") plt.tight_layout() save_and_show(filename)注意:占比类图表也可用条形图替代,饼图适合类别少、强调「整块」的场景。
5.8 热力图(Heatmap)— 看矩阵/强度
承接 5.7:饼图是「两类占比」;热力图适合矩阵数据——颜色深浅表示数值大小。
用途:相关矩阵、日历热力、地理温度网格——颜色深浅表示数值大小。
本教程:简化版——12 个月平均气温一行热力条。
代码(可视化分析.py→plot_heatmap_month_day()):
def plot_heatmap_month_day(df, filename="08_热力图_月平均气温.png"): monthly_avg = df.groupby("month")["temp_mean"].mean().values.reshape(1, -1) plt.figure(figsize=(12, 2.8)) im = plt.imshow(monthly_avg, aspect="auto", cmap="coolwarm") plt.colorbar(im, label="平均气温 (°C)") plt.xticks(range(12), MONTH_LABELS) plt.yticks([0], [f"{YEAR}年"]) plt.title(f"{CITY}市 {YEAR} 年各月平均气温(热力图)") plt.tight_layout() save_and_show(filename)何时用:二维矩阵数据、时间×类别 的强度展示。
机器学习里:特征相关矩阵热力图、混淆矩阵可视化。
六、可视化与机器学习的关系
可视化不是独立技能,而是贯穿「看数据 → 训模型 → 讲结果」的纽带。
| 阶段 | 可视化作用 |
|---|---|
| 探索性分析(EDA) | 直方图、散点图发现异常与相关 |
| 特征工程 | 箱线图比较分组、热力图看相关矩阵 |
| 训练监控 | 损失曲线、参数收敛 |
| 算法对比 | 多条损失曲线、参数路径 |
| 模型解释 | 特征重要性柱状图、决策边界散点图 |
| 结果汇报 | 各类业务图表 |