pin_drop当前位置:知识文库 ❯ 图文
matplotlib散点图scatter教程 - 多维数据可视化与颜色映射
一、概述
plt.scatter()用于绘制散点图,通过二维平面上的点展示两个变量之间的关系。散点图是探索性数据分析的核心工具,可以直观地发现变量间的相关性、聚类趋势和异常值。
scatter()支持通过颜色、大小和标记样式编码额外维度的信息,可以在一张图上同时展示2-4个维度的数据。
二、基本语法
代码示例
plt.scatter(x, y, s=None, c=None, marker='o', **kwargs)
通过s(size)和c(color)参数,可以为每个点单独设置大小和颜色,实现多维数据可视化。
三、参数说明
四、代码示例
示例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对比
七、注意事项
-
大数据量:数据点过多时(>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()。
本文涉及AI创作
内容由AI创作,请仔细甄别