pin_drop当前位置:知识文库 ❯ 图文

matplotlib散点图scatter教程 - 多维数据可视化与颜色映射

一、概述

plt.scatter()用于绘制散点图,通过二维平面上的点展示两个变量之间的关系。散点图是探索性数据分析的核心工具,可以直观地发现变量间的相关性、聚类趋势和异常值。

scatter()支持通过颜色、大小和标记样式编码额外维度的信息,可以在一张图上同时展示2-4个维度的数据。

二、基本语法

代码示例

plt.scatter(x, y, s=None, c=None, marker='o', **kwargs)

通过s(size)和c(color)参数,可以为每个点单独设置大小和颜色,实现多维数据可视化。

三、参数说明

参数 类型 默认值 说明
x array_like 必填 X轴数据
y array_like 必填 Y轴数据
s scalar/array 20 点的大小(面积)
c str/array 'b' 点的颜色,可为颜色序列或数值映射
marker str 'o' 标记样式
cmap str/Colormap None 颜色映射(c为数值时使用)
alpha float None 透明度
linewidths scalar 1.5 点边框宽度
edgecolors str 'face' 点边框颜色
vmin/vmax float None 颜色映射范围

四、代码示例

示例1:基本散点图

绘制随机数据的基本散点图,设置透明度和边框:

代码示例

import matplotlib.pyplot as plt
import numpy as np

# 生成数据
np.random.seed(42)
x = np.random.randn(50)
y = np.random.randn(50)

# 绘制基本散点图
plt.figure(figsize=(8, 6))
plt.scatter(x, y, c='#2196F3', alpha=0.6, edgecolors='white', s=100)
plt.title('Basic Scatter Plot')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True, alpha=0.3)
plt.savefig('basic_scatter.png', dpi=100, bbox_inches='tight')
print("基本散点图已保存")

示例2:颜色和大小编码多维信息

使用颜色和大小编码第三、第四维度的数据,实现多维可视化:

代码示例

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
n = 100
x = np.random.randn(n)
y = x * 0.8 + np.random.randn(n) * 0.3  # 正相关
sizes = np.random.randint(50, 500, n)     # 第三维:大小
colors = np.random.randn(n)               # 第四维:颜色

plt.figure(figsize=(10, 7))
scatter = plt.scatter(x, y, s=sizes, c=colors, cmap='viridis',
                      alpha=0.6, edgecolors='white', linewidth=0.5)

# 添加颜色条
cbar = plt.colorbar(scatter, label='Color Value')

plt.title('Scatter Plot with Size and Color Encoding')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True, alpha=0.3)
plt.savefig('multi_dim_scatter.png', dpi=100, bbox_inches='tight')
print("多维散点图已保存")

示例3:分组散点图与趋势线

绘制多组数据并添加线性回归趋势线:

代码示例

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)

# 三组数据
group_a_x = np.random.normal(3, 1, 30)
group_a_y = np.random.normal(5, 1, 30)

group_b_x = np.random.normal(7, 1, 30)
group_b_y = np.random.normal(8, 1, 30)

group_c_x = np.random.normal(5, 1.5, 30)
group_c_y = np.random.normal(3, 1.5, 30)

plt.figure(figsize=(9, 6))
plt.scatter(group_a_x, group_a_y, c='#2196F3', s=80, alpha=0.7, label='Group A', edgecolors='white')
plt.scatter(group_b_x, group_b_y, c='#FF5722', s=80, alpha=0.7, label='Group B', edgecolors='white')
plt.scatter(group_c_x, group_c_y, c='#4CAF50', s=80, alpha=0.7, label='Group C', edgecolors='white')

# 添加趋势线
all_x = np.concatenate([group_a_x, group_b_x, group_c_x])
all_y = np.concatenate([group_a_y, group_b_y, group_c_y])
z = np.polyfit(all_x, all_y, 1)
p = np.poly1d(z)
x_line = np.linspace(all_x.min(), all_x.max(), 100)
plt.plot(x_line, p(x_line), 'k--', alpha=0.5, linewidth=2, label='Trend Line')

plt.title('Grouped Scatter Plot with Trend Line')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig('grouped_scatter.png', dpi=100, bbox_inches='tight')
print("分组散点图已保存")

五、实际应用场景

  • 探索性数据分析:使用散点图探索两个变量之间的相关关系,发现正相关、负相关或无相关性

  • 机器学习:使用散点图可视化聚类结果和决策边界,评估分类器效果

  • 地理信息:使用散点图展示城市分布,大小编码人口,颜色编码GDP,实现多维数据地理可视化

六、散点图与plot对比

特性 scatter() plot()
每点独立样式 支持 不支持
颜色映射 支持 不支持
点大小编码 支持 不支持
渲染速度 较慢
适用场景 探索性分析 趋势展示

七、注意事项

  • 大数据量:数据点过多时(>10000),scatter()渲染较慢,可考虑使用plot()的标记模式

  • s参数含义:s参数是点的面积而非半径,s=100对应半径约为5.6的圆

  • 透明度设置:alpha参数在数据重叠时非常重要,建议设置为0.3-0.7

小贴士:常用颜色映射(cmap)包括:'viridis'、'plasma'、'coolwarm'、'jet'等。viridis是matplotlib的默认cmap,具有良好的视觉区分度和对色盲友好的特点。

八、小结

  • scatter()通过二维点展示变量关系,支持颜色和大小编码额外维度

  • c参数配合cmap实现颜色映射,colorbar()添加颜色条

  • 分组散点图通过多次调用scatter()实现,每组设置不同颜色和label

  • 数据量大时注意设置alpha透明度,避免点重叠导致信息丢失

九、练习题

练习1

生成100个随机点,绘制散点图,使用颜色编码X值大小,添加颜色条。

练习2

生成两组正态分布数据,用不同颜色绘制分组散点图,添加图例。

练习3

绘制散点图并用np.polyfit拟合一条线性趋势线,展示在图上。

常见问题

如何为散点图添加颜色条(colorbar)?

使用plt.colorbar()函数,传入scatter()返回的对象作为参数。例如:scatter = plt.scatter(x, y, c=colors, cmap='viridis'); plt.colorbar(scatter, label='数值')。颜色条会显示颜色与数值的对应关系。

如何处理散点图中点的重叠问题?

有三种方法:1)设置alpha透明度(如alpha=0.5),让重叠区域颜色更深;2)减小点的大小s参数;3)使用抖动(jitter),给数据点添加微小随机偏移:x + np.random.uniform(-0.1, 0.1, len(x))。

如何自定义颜色映射(cmap)的范围?

使用vmin和vmax参数设置颜色映射的范围。例如:plt.scatter(x, y, c=values, cmap='viridis', vmin=0, vmax=100)。这样即使数据中有异常值,颜色映射也不会被拉伸变形。

scatter()可以绘制不同形状的标记吗?

可以。marker参数支持多种标记:'o'(圆圈)、's'(方块)、'^'(三角)、'D'(菱形)、'*'(星形)、'+'(加号)等。但注意,每次scatter()调用只能使用一种标记样式,要混合标记需要多次调用scatter()。

标签: 散点图 plt.scatter 多维数据 颜色映射 colorbar 数据探索 趋势线

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: matplotlib柱状图bar教程 - 分组堆叠水平柱状图详解 下一篇: matplotlib饼图pie教程 - 环形图突出显示百分比标注

poll相关推荐