散点图矩阵是一种显示多个变量之间关系的数据可视化工具,特别是当数据集包含三个或多个变量时,这种图表非常有用。这种图通常在探索性数据分析中使用,以便快速理解数据集中变量之间的关系。在散点图矩阵中,每行和每列都代表数据集中的一个变量,而矩阵中的每个小图(除了对角线)都是两个变量之间的散点图。
对角线图形:通常是每个变量的单变量分布。在您上传的图像中,这些是密度图,也可以是直方图或箱线图。它们提供了变量自身分布的视觉概览。
非对角线图形:这些是散点图,显示了数据集中每对变量间的关系。每个点代表数据集中的一个观测值。在您的图中,不同颜色的点代表
1、多变量关系展示:
对角线上方和下方的图是散点图,显示两个变量之间的关系。散点的分布可以揭示变量之间是否存在相关性,比如线性关系、非线性关系或没有明显关系。
2、分布可视化:
对角线上的图通常是直方图或密度图,显示单个变量的分布。这有助于了解数据的分布形状、集中趋势和离散程度。
3、数据分组:
不同的颜色或形状可以代表数据中的分类变量。
关系识别:快速识别多个变量间的潜在关系,比如线性、非线性或没有关系。
异常值检测:观察数据点集群之外的点来识别异常值。
分布检查:在对角线的图表帮助理解各个变量的分布特征。
群组比较:使用颜色或形状区分不同的群组,可以帮助比较不同群组的特征。
下面我们分别使用matlab以及python实现该种绘图。为了结果的准确性,我们使用国赛2017年C题的数据集进行绘制。
首先,利用python绘制这种散点图矩阵。如下所示
import seaborn as sns
import matplotlib.pyplot as plt
# 创建数据框
data = {
'浓度(ppm)': [0, 100, 50, 25, 12.5, 0, 100, 50, 25, 12.5],
'B': [68, 37, 46, 62, 66, 65, 35, 46, 60, 64],
'G': [110, 66, 87, 99, 102, 110, 64, 87, 99, 101],
'R': [121, 110, 117, 120, 118, 120, 109, 118, 120, 118],
'H': [23, 12, 16, 19, 20, 24, 11, 16, 19, 20],
'S': [111, 169, 155, 122, 112, 115, 172, 153, 126, 115]
}
df = pd.DataFrame(data)
# 使用Seaborn绘制散点矩阵图
sns.set(style="ticks")
sns.pairplot(df, diag_kind="kde", markers="o")
# 显示图形
plt.show()
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 创建数据框
data = {
'浓度(ppm)': [0, 100, 50, 25, 12.5, 0, 100, 50, 25, 12.5],
'B': [68, 37, 46, 62, 66, 65, 35, 46, 60, 64],
'G': [110, 66, 87, 99, 102, 110, 64, 87, 99, 101],
'R': [121, 110, 117, 120, 118, 120, 109, 118, 120, 118],
'H': [23, 12, 16, 19, 20, 24, 11, 16, 19, 20],
'S': [111, 169, 155, 122, 112, 115, 172, 153, 126, 115]
}
df = pd.DataFrame(data)
# 定义数据列数量
cols = df.columns
n = len(cols)
# 扩展颜色列表以匹配数据列的数量
extended_colors = sns.color_palette("husl", n)
# 设置更大的图表尺寸和字体大小
plt.figure(figsize=(20, 20))
plt.rcParams.update({'font.size': 10})
for i in range(n):
for j in range(n):
ax = plt.subplot(n, n, i * n + j + 1)
if i == j:
sns.kdeplot(df[cols[i]], color=extended_colors[i], ax=ax)
else:
sns.scatterplot(x=cols[j], y=cols[i], data=df, color=extended_colors[j], ax=ax)
# 设置坐标轴标签
plt.xlabel(cols[j])
plt.ylabel(cols[i])
# 增加网格线
plt.grid(True)
# 增加整体标题和调整布局
plt.suptitle("散点图矩阵 - 进一步美化版", fontsize=24)
plt.subplots_adjust(top=0.95, hspace=0.4, wspace=0.4)
# 显示图形
plt.show()
为了进一步美化可视化,我们在每一张图中,都绘制了线性回归的拟合图如下所示。
% 创建数据矩阵
data = [
0 68 110 121 23 111
100 37 66 110 12 169
50 46 87 117 16 155
25 62 99 120 19 122
12.5 66 102 118 20 112
0 65 110 120 24 115
100 35 64 109 11 172
50 46 87 118 16 153
25 60 99 120 19 126
12.5 64 101 118 20 115
];
% 创建变量名
varNames = {'浓度 (ppm)', 'B', 'G', 'R', 'H', 'S'};
% 创建数据表格
dataTable = array2table(data, 'VariableNames', varNames);
% 绘制散点矩阵图
figure;
gplotmatrix(dataTable{:,:}, [], [], [], [], [], false);
% 添加标签和标题
xlabel('X轴标签');
ylabel('Y轴标签');
title('散点矩阵图');
% 调整坐标轴范围
xlim([min(data(:)) max(data(:))]);
ylim([min(data(:)) max(data(:))]);
% 自定义图例
legend({'类别1', '类别2', '类别3'});
% 调整图的尺寸
set(gcf, 'Position', [100, 100, 800, 600]); % 设置图的位置和大小
% 创建数据矩阵
data = [
0 68 110 121 23 111
100 37 66 110 12 169
50 46 87 117 16 155
25 62 99 120 19 122
12.5 66 102 118 20 112
0 65 110 120 24 115
100 35 64 109 11 172
50 46 87 118 16 153
25 60 99 120 19 126
12.5 64 101 118 20 115
];
% 创建变量名
varNames = {'浓度 (ppm)', 'B', 'G', 'R', 'H', 'S'};
% 创建数据矩阵和变量名
% ... [数据和变量名的代码] ...
% 创建数据表格
dataTable = array2table(data, 'VariableNames', varNames);
% 绘制散点矩阵图
figure;
colors = lines(size(data, 2)); % 使用 lines 颜色图
markerShapes = {'+', 'o', '*', '.', 'x', 's', 'd', '^', 'v', '>'}; % 标记形状
[h, ax] = gplotmatrix(dataTable{:,:}, [], [], colors, markerShapes, 12, 'on', 'hist', varNames, varNames);
% 美化轴标签和标题
set(ax, 'FontSize', 12, 'FontWeight', 'Bold');
title('散点矩阵图', 'FontSize', 16, 'FontWeight', 'Bold');
xlabel('X轴标签', 'FontSize', 14);
ylabel('Y轴标签', 'FontSize', 14);
% 添加网格线
set(ax, 'XGrid', 'on', 'YGrid', 'on');
% 调整子图间的间距
set(ax, 'XTickLabelRotation', 45, 'YTickLabelRotation', 45);
% 改进颜色映射
colormap('jet');
% 添加颜色说明标签
for i = 1:length(varNames)
annotation('textbox', [.85, 1 - 0.05*i, .1, .05], 'String', varNames{i}, 'Color', colors(i,:), 'EdgeColor', 'none');
end
% 保存图像
saveas(gcf, '散点矩阵图_改进版.png');