一、什么是散點圖
? ? ? ?散點圖是一種用來展示兩個或多個變量之間關系的圖表形式。它可以幫助我們直觀地觀察變量之間是否存在相關性、趨勢或異常值,常用于數據分析的初步探索階段。
二、三種類型散點圖
1.?基本二維散點圖:最簡單、最常用
基本二維散點圖的適用場景
? ? ? ?當你手頭只有兩個連續的數字變量,比如“身高”和“體重”,或者“價格”和“銷量”,想看它們之間有沒有關系時,用這個最合適。
舉個例子:
? ? ? ?你想知道一個人身高越高,是不是體重也越重?那你就畫個散點圖,把“身高”當橫軸,“體重”當縱軸,點一畫上去,圖就出來了。如果點大致排成一條斜線,那就說明:它們有關!
?適用場景總結
-
觀察趨勢和相關性
-
檢查是否有異常值
-
做初步的數據探索
2. 按類別分組著色的散點圖:比較不同“群體”的差異
? 按類別分組著色的散點圖的適用場景
? ? ? ?當你有兩個數值變量(比如“身高”和“體重”),但你還知道每個人是男生還是女生,或者是來自不同城市的。你想對比不同群體在這些數值上的分布,這時候就需要分組著色的散點圖。
舉個例子:
? ? ? ?你把男性的數據點涂成藍色,女性的數據點涂成紅色,一下就能看出:女生更集中在某個區域,男生在哪里分布更廣,等等。
?適用場景總結
-
分類變量(性別、地區、類型)+ 兩個數值變量
-
想看不同群體的差異或分布趨勢
-
非常適合做對比分析
3. 三維散點圖:一次看三個數字變量
三維散點圖的適用場景
? ? ? ?你現在不僅有“身高”和“體重”,還有“年齡”,想看三者之間有沒有關系。這時候就可以用三維散點圖。它比二維圖多了一個維度,可以在空間中呈現點的“走向”。
舉個例子:
? ? ? ?你在一張 3D 圖里看出:隨著年齡增加,身高先升后降,體重慢慢變大——這種復雜的關系,二維圖是看不出來的。
適用場景總結:
-
同時分析三個數值變量
-
適合探索復雜的多變量關系
-
更適合有交互式可視化支持的場景
你手上有什么數據? | 用哪種散點圖? |
兩個數字(例:身高、體重) | 基本二維散點圖 |
兩個數字 + 一個分類(例:性別) | 分組著色散點圖 |
三個數字(例:身高、體重、年齡) | 三維散點圖 |
三、實現繪圖前的數據檢查
針對三種類型的散點圖數據需求
散點圖類型 | 特別準備事項 |
基本二維散點圖 | 確保兩個變量都是數值型 |
分組著色散點圖 | 第三個變量(分類)需為字符串或分類類型 |
三維散點圖 | 三個變量都需為連續數值型,且無缺失 |
四、MATLAB繪制相應散點圖
1. 基本二維散點圖繪制
? ? ? 只要兩個數值變量,比如“身高”和“體重”,用最基礎的 scatter()
函數就能搞定。
? ? ? 以下是相關代碼實現:
% 讀取數據并保留原始列名,使得原本中文列名不被修改,以下用調取excel表格為例
data = readtable('散點圖制作.xlsx', 'sheet', 'sheet1', 'VariableNamingRule', 'preserve');
x = data.('身高');
y = data.('體重');
% 創建圖形窗口
figure('Color', 'w');
% 繪制較小圓點的散點圖,以下數據大小可以按需更改
scatter(x, y, 40, ... % 點大小改為40(點較小,可以按照需求更改)'MarkerEdgeColor', [0.3 0.5 0.7], ...% 點的邊緣顏色設為藍灰色'MarkerFaceColor', [0.5 0.7 0.9], ...% 點的填充顏色為淡藍色'MarkerFaceAlpha', 0.6, ...% 點的透明度設置為 0.6'LineWidth', 0.6); % 線條粗細
hold on
% 擬合數據后,添加趨勢線(淺紅虛線)
p = polyfit(x, y, 1);
yfit = polyval(p, x);
plot(x, yfit, '--', 'Color', [1 0.4 0.4], 'LineWidth', 1.5);% 顏色粗細也均可更改
% 標簽和標題字體大小與類型(字體略小,可自我調整)
xlabel('身高 (cm)', 'FontSize', 11,'FontWeight', 'bold','FontName', '宋體')
ylabel('體重 (kg)', 'FontSize', 11,'FontWeight', 'bold','FontName', '宋體')
title('身高與體重的關系', 'FontSize', 13, 'FontWeight', 'bold','FontName', '宋體')
% 圖例(去邊框,略小字體)
legend({'數據點', '趨勢線'}, 'Location', 'southeast', 'Box', 'off', 'FontSize', 10)
% 網格和坐標軸美化
grid on
box off
set(gca, 'FontSize', 10, 'LineWidth', 1, 'TickDir', 'out')
散點圖實現:
?2. 按類別分組著色的散點圖繪制
? ? ? ? 需要有兩個數值變量,比如“身高”和“體重”,再加上一個分類變量(比如“性別”),就可以通過循環搭配 scatter()
函數,輕松畫出按類別分組著色的散點圖。不同類別的數據點用不同顏色區分,既直觀又美觀,適合展示各類數據在二維數值變量上的分布差異。
? ? ? ? 以下是相關代碼實現:
% 讀取數據并保留原始列名,使得原本中文列名不被修改
data = readtable('散點圖制作.xlsx', 'sheet', 'sheet2', 'VariableNamingRule', 'preserve');
x = data.('身高');
y = data.('體重');
group = data.('性別'); % 分類變量提取,按照實際情況修改
% 獲取唯一類別標簽
groups = unique(group);
colors = lines(length(groups));
% 創建圖形窗口
figure('Color', 'w');
hold on;
% 按類別繪制散點圖并添加擬合線
for i = 1:length(groups)idx = strcmp(group, groups{i}); % 當前類別的數據索引% 繪制較小圓點的散點圖,以下數據大小可以按需更改scatter(x(idx), y(idx), 40, ...'MarkerEdgeColor', [0.2 0.2 0.2], ...'MarkerFaceColor', colors(i, :), ...'MarkerFaceAlpha', 0.6, ...'LineWidth', 0.6, ...'DisplayName', groups{i}); % 設置圖例% 擬合線(每組單獨)p = polyfit(x(idx), y(idx), 1); xfit = linspace(min(x(idx)), max(x(idx)), 100); yfit = polyval(p, xfit); plot(xfit, yfit, '--', ...'Color', colors(i, :), ...'LineWidth', 1.5, ...'DisplayName', [groups{i} ' - 擬合線']);
end
% 坐標軸標簽和標題(字體可按需修改)
xlabel('身高 (cm)', 'FontSize', 11, 'FontWeight', 'bold', 'FontName', '宋體')
ylabel('體重 (kg)', 'FontSize', 11, 'FontWeight', 'bold', 'FontName', '宋體')
title('不同性別的身高與體重關系(含趨勢線)', 'FontSize', 13, 'FontWeight', 'bold', 'FontName', '宋體')
% 圖例
legend('Location', 'southeast', 'Box', 'off', 'FontSize', 10)
% 網格和坐標軸美化
grid on
box off
set(gca, 'FontSize', 10, 'LineWidth', 1, 'TickDir', 'out')
散點圖實現:
3. 三維散點圖的繪制
? ? ? ?需要有三個數值變量,比如“身高”、“體重”和“年齡”,再加上一個分類變量(比如“性別”),就可以通過循環搭配 scatter3()
函數,輕松繪制出按類別分組著色的三維散點圖。不同類別的數據點用不同顏色標識,在三維空間中直觀展示出變量之間的立體分布關系,特別適合用來觀察多變量之間的聯合趨勢與類別間的結構差異。
? ? ? ? 以下是相關代碼實現:
% 讀取數據并保留原始列名,使得原本中文列名不被修改
data = readtable('散點圖制作.xlsx', 'sheet', 'sheet3', 'VariableNamingRule', 'preserve');
x = data.('身高');
y = data.('體重');
z = data.('年齡'); % 增加的第三個數值變量
group = data.('性別'); % 分類變量
% 類別和顏色
groups = unique(group);
colors = lines(length(groups));
% 圖形窗口
figure('Color', 'w', 'Position', [100 100 800 600]);
hold on;
ax = gca;
ax.Color = [0.97 0.97 0.97];
ax.GridColor = [0.8 0.8 0.8];
ax.GridAlpha = 0.4;
% 繪制三維散點圖,以下數據可以按需修改
for i = 1:length(groups)idx = strcmp(group, groups{i});scatter3(x(idx), y(idx), z(idx), 60, ...'MarkerEdgeColor', [0.3 0.3 0.3], ...'MarkerFaceColor', colors(i,:), ...'MarkerFaceAlpha', 0.7, ...'LineWidth', 0.7, ...'DisplayName', groups{i});
end
% 標簽和標題字體大小與類型(字體略小,可自我調整)
xlabel('身高 (cm)', 'FontSize', 12, 'FontWeight', 'bold', 'FontName', '宋體');
ylabel('體重 (kg)', 'FontSize', 12, 'FontWeight', 'bold', 'FontName', '宋體');
zlabel('年齡 (歲)', 'FontSize', 12, 'FontWeight', 'bold', 'FontName', '宋體');
title('不同性別的身高、體重與年齡三維分布', ...'FontSize', 14, 'FontWeight', 'bold', 'FontName', '宋體');
legend('Location', 'northeastoutside', 'Box', 'off', 'FontSize', 10);
% 美化坐標軸
view(45, 20);
grid on;
box on;
rotate3d on;
axis tight;
set(gca, 'FontSize', 10, 'FontName', '宋體', 'LineWidth', 1, 'TickDir', 'out');
camproj perspective;
散點圖實現:
? ? ? ?通過上面的案例示范,相信大家已經了解了如何利用 MATLAB 繪制不同的散點圖。可視化不僅讓數據更易于理解,也為后續的數據分析和交流打下了良好基礎。如果你也在處理類似的多變量數據,不妨動手試一試,讓圖形為你的分析加分!(如有不對的地方也可以指出哦~)?