Matplotlib 散点图:数据关系的可视化
散点图基础
散点图是数据可视化中最常用的图表之一,它通过在二维坐标系中绘制点来展示两个变量之间的关系。每个点的位置由其对应的两个变量值决定,非常适合用于观察数据分布、发现趋势或识别异常值。
1. 绘制基本散点图
首先,我们来看如何使用 Matplotlib 的 scatter 函数绘制一个简单的散点图。这个示例将展示两个变量之间的二次关系。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
# 生成示例数据
# 创建一个从 -5 到 5 的等差数列
x_values = np.linspace(-5, 5, 25)
# 创建一个与 x_values 相关的 y 值,并添加一些随机噪声
y_values = 2 * x_values**2 + np.random.normal(0, 8, 25)
# 创建画布
plt.figure(figsize=(8, 5))
# 绘制散点图
plt.scatter(x_values, y_values, s=60, c='#1f77b4', alpha=0.7, label='数据点')
# 添加图例和标签
plt.legend()
plt.xlabel('X 轴变量')
plt.ylabel('Y 轴变量')
plt.title('基本散点图示例')
# 显示图形
plt.show()
2. 带分类标签的散点图
在许多场景下,我们需要根据数据的类别(或标签)来着色散点。这有助于我们直观地观察不同类别数据在特征空间中的分布情况。
# 导入用于生成合成数据的库
from sklearn.datasets import make_blobs
# 生成具有三个类别的合成数据
features, labels = make_blobs(n_samples=100, centers=3, cluster_std=2.0, random_state=42)
# 定义颜色映射
color_palette = ['#ff7f0e', '#2ca02c', '#d62728']
# 创建画布
plt.figure(figsize=(8, 6))
# 根据类别循环绘制散点
for i in range(3):
plt.scatter(features[labels == i, 0], features[labels == i, 1],
s=50, c=color_palette[i], label=f'类别 {i}')
# 添加图例和标题
plt.legend()
plt.title('带分类标签的散点图')
plt.xlabel('特征 1')
plt.ylabel('特征 2')
# 显示图形
plt.show()
3. 使用真实数据集进行实战
让我们使用一个真实的数据集来创建一个更复杂的散点图。这里我们使用 Seaborn 内置的 "iris" 数据集,它包含了三种不同鸢尾花的测量数据。
# 导入数据分析和可视化库
import seaborn as sns
import matplotlib.pyplot as plt
# 加载内置的 iris 数据集
iris_df = sns.load_dataset('iris')
# 提取唯一的物种类别
species_list = iris_df['species'].unique()
# 为每个物种分配一种颜色
color_map = plt.cm.tab10
colors = [color_map(i / float(len(species_list) - 1)) for i in range(len(species_list))]
# 设置图形样式
plt.style.use('seaborn-whitegrid')
plt.figure(figsize=(12, 8))
# 循环绘制每个物种的散点
for i, species in enumerate(species_list):
subset = iris_df[iris_df['species'] == species]
plt.scatter(subset['sepal_length'], subset['sepal_width'],
s=80, c=[colors[i]], label=species, alpha=0.8)
# 设置坐标轴范围和标签
plt.xlim(4, 8)
plt.ylim(2, 4.5)
plt.xlabel('花萼长度 (cm)', fontsize=14)
plt.ylabel('花萼宽度 (cm)', fontsize=14)
plt.title('鸢尾花数据集:花萼长度 vs 花萼宽度', fontsize=16)
plt.legend(fontsize=12)
# 显示图形
plt.show()