趋近智
应用Matplotlib和Seaborn绘图技术能够有效地进行数据集的视觉分析。此实践指南将引导您使用这些工具。我们将载入一个数据集,提出关于数据的问题,并利用可视化来找到答案,从而展示图形表示如何帮助理解数据结构、分布和关联。
我们将使用知名的鸢尾花数据集,该数据集可通过Seaborn便捷获取。此数据集包含三种鸢尾花物种的测量数据。
首先,让我们导入所需的库,并将数据集载入Pandas DataFrame。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 从Seaborn载入鸢尾花数据集
iris = sns.load_dataset('iris')
# 显示前几行和信息,以理解数据结构
print(iris.head())
print("\n数据集信息:")
iris.info()
您应该看到萼片长度、萼片宽度、花瓣长度、花瓣宽度(均为数值型)以及物种(类别型)的列。
数据查看的基本步骤是理解单个变量的分布。让我们查看花瓣长度的分布。我们可以为此使用Matplotlib。
# 设置图表样式(可选,但通常能改善外观)
sns.set_style("whitegrid")
plt.figure(figsize=(8, 5)) # 创建图形并设置其大小
plt.hist(iris['petal_length'], bins=15, color='teal', edgecolor='black')
plt.title('花瓣长度分布')
plt.xlabel('花瓣长度 (厘米)')
plt.ylabel('频数')
plt.show()
此直方图显示了不同范围的花瓣长度在数据集中出现的频率。您可能会观察到多个峰值,可能表示不同物种之间的差异。
我们使用Seaborn的histplot或kdeplot(核密度估计)可以得到类似、通常更为精细的结果。
plt.figure(figsize=(8, 5))
sns.histplot(data=iris, x='petal_length', bins=15, kde=True, color='indigo') # 添加密度曲线
plt.title('花瓣长度分布 (Seaborn)')
plt.xlabel('花瓣长度 (厘米)')
plt.ylabel('频数')
plt.show()
Seaborn图表会自动添加标签,并且可以轻松包含平滑密度曲线(kde=True),为分布提供了另一种视角。
散点图非常适合可视化两个数值变量之间的关联。让我们查看花瓣长度和花瓣宽度之间是否存在关联。
plt.figure(figsize=(8, 6))
plt.scatter(iris['petal_length'], iris['petal_width'], alpha=0.7, color='orange')
plt.title('花瓣长度与花瓣宽度')
plt.xlabel('花瓣长度 (厘米)')
plt.ylabel('花瓣宽度 (厘米)')
plt.grid(True) # 添加网格线
plt.show()
此图很可能显示出正关联:花瓣较长的花通常花瓣也较宽。alpha参数有助于显示重叠点。
Seaborn的scatterplot函数可以通过根据第三个变量(如物种)自动对点进行着色来增强这一点。
plt.figure(figsize=(8, 6))
sns.scatterplot(data=iris, x='petal_length', y='petal_width', hue='species', palette='viridis')
plt.title('按物种划分的花瓣长度与花瓣宽度')
plt.xlabel('花瓣长度 (厘米)')
plt.ylabel('花瓣宽度 (厘米)')
plt.show()
添加hue参数清楚地分离了物种,显示出不同的聚类,并加强了我们对物种组内部及之间关联的理解。
我们认为不同物种可能具有不同的测量分布。箱线图或小提琴图非常适合比较不同类别组的分布。让我们使用Seaborn比较三种物种的萼片宽度。
plt.figure(figsize=(9, 6))
sns.boxplot(data=iris, x='species', y='sepal_width', palette='pastel')
plt.title('按物种划分的萼片宽度分布')
plt.xlabel('物种')
plt.ylabel('萼片宽度 (厘米)')
plt.show()
# 换个视角,尝试小提琴图
plt.figure(figsize=(9, 6))
sns.violinplot(data=iris, x='species', y='sepal_width', palette='Set2')
plt.title('按物种划分的萼片宽度分布 (小提琴图)')
plt.xlabel('物种')
plt.ylabel('萼片宽度 (厘米)')
plt.show()
这两个图表有效地显示了萼片宽度的分布(中位数、四分位数、范围以及小提琴图中的密度形状)在鸢尾花物种之间存在差异。
为了快速查看所有数值变量之间的成对关联,Seaborn的pairplot非常有用。它会为数值变量创建一个散点图矩阵,并在对角线上显示直方图(或KDE图)。
# 生成成对图,按物种着色
# 对角线使用 kind='kde' 以显示密度图而非直方图
sns.pairplot(iris, hue='species', palette='bright', diag_kind='kde')
plt.suptitle('鸢尾花数据集中的成对关联', y=1.02) # 在图上方添加主标题
plt.show()
pairplot提供了数据的密集总结。您可以快速查看它以识别所有特征组合中潜在的关联、聚类以及物种之间分布差异。
热力图是数据的一种图形表示,其中数值用颜色表示。它对于可视化关联矩阵特别有用。让我们计算数值特征之间的关联,并将其显示为热力图。
# 只选择数值列进行关联计算
numerical_iris = iris.select_dtypes(include=np.number)
# 计算关联矩阵
correlation_matrix = numerical_iris.corr()
# 打印矩阵(可选)
print("\n关联矩阵:")
print(correlation_matrix)
# 创建热力图
plt.figure(figsize=(7, 5))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f", linewidths=.5)
# annot=True 在图上显示关联值
# cmap 设置颜色映射
# fmt=".2f" 将标注数字格式化为两位小数
plt.title('鸢尾花特征关联矩阵')
plt.show()
热力图直观地确认了之前看到的花瓣长度和花瓣宽度之间存在的强正关联,并显示了其他关联,例如萼片宽度和花瓣长度之间的负关联。
虽然Matplotlib和Seaborn创建静态图表,但Plotly等库允许交互式可视化,这在网页环境或详细查看时非常有用。下面是如何创建与上方类似的交互式散点图。
交互式散点图,显示花瓣长度与花瓣宽度,按物种着色。将鼠标悬停在点上以查看详情。
(请注意:显示交互式图表需要兼容的环境。上述JSON结构定义了一个Plotly图表。)
一旦您创建了有信息的可视化结果,通常需要将其保存。Matplotlib使用plt.savefig()使其简单直接。
# 示例:创建并保存之前的箱线图
plt.figure(figsize=(9, 6))
sns.boxplot(data=iris, x='species', y='sepal_width', palette='pastel')
plt.title('按物种划分的萼片宽度分布')
plt.xlabel('物种')
plt.ylabel('萼片宽度 (厘米)')
# 在显示图表前保存
plt.savefig('iris_sepal_width_boxplot.png', dpi=300) # 以更高分辨率保存为PNG格式
# 您也可以保存为PDF、JPG、SVG等格式
# plt.savefig('iris_sepal_width_boxplot.pdf')
plt.show() # 保存后显示图表
本实践部分演示了如何应用各种Matplotlib和Seaborn函数通过视觉方式查看数据集。您学习了绘制分布、关联、组间比较和关联度。请记住,选择合适的图表取决于数据类型以及您尝试回答的问题。有效的可视化是数据分析和机器学习中一项重要能力,它使您能够获得见解并清晰地传达结果。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造