3. Matlab绘图指南:散点图
散点图是一种常用的数据可视化工具,能够展示数据之间的关系和分布情况。在Matlab中,绘制散点图非常简单,同时又具有丰富的功能和灵活的定制选项。本教程将逐步引导你学习Matlab中绘制散点图的方法和技巧,并通过详细的解释、示例和有趣的案例分析,帮助你全面了解散点图绘制的过程。
文章目录
3.1 绘制简单散点图
让我们从最简单的散点图开始,首先创建一组随机数据,并绘制散点图。
% 创建数据
x = randn(100, 1);
y = randn(100, 1);
% 绘制散点图
scatter(x, y);
% 添加标题和标签
title('Simple Scatter Plot');
xlabel('X');
ylabel('Y');
在这个例子中,我们使用randn
函数创建了两组100个随机数作为x和y坐标。然后,我们使用scatter
函数绘制了散点图,并使用title
、xlabel
和ylabel
函数添加了标题和标签。
3.2 自定义样式和颜色
除了基本的散点图,Matlab还提供了许多自定义选项,包括样式和颜色的设置。让我们继续优化散点图的样式和颜色。
% 创建数据
x = randn(100, 1);
y = randn(100, 1);
sizes = 30 + 100 * rand(1, 100);
colors = rand(1, 100);
% 绘制散点图
scatter(x, y, sizes, colors, 'filled');
% 添加标题和标签
title('Customized Scatter Plot');
xlabel('X');
ylabel('Y');
% 添加网格
grid on;
在这个例子中,我们通过定义sizes
和colors
数组,为每个数据点指定了大小和颜色。然后,我们在scatter
函数中使用这些数组,并将参数'filled'
设置为填充散点图。最后,我们添加了网格以增强图表的可读性。
3.3 添加趋势线
在散点图中添加趋势线能够更直观地展示数据的趋势和相关性。我们使用polyfit
函数拟合数据并绘制趋势线。
% 生成数据
n = 100; % 数据点数量
heights = linspace(150, 190, n); % 生成身高数据,从150到190之间均匀分布
weights = heights * 0.6 + randn(1, n) * 5; % 根据身高生成体重数据,加入随机噪声
% 绘制散点图
scatter(heights, weights, 'filled', 'MarkerFaceColor', [0.2 0.6 0.9], 'MarkerEdgeColor', 'k');
% 添加趋势线
hold on;
coefficients = polyfit(heights, weights, 1);
fitted_values = polyval(coefficients, heights);
plot(heights, fitted_values, 'r-', 'LineWidth', 2);
hold off;
% 添加标题和标签
title('Relationship between Height and Weight', 'FontSize', 14, 'FontWeight', 'bold');
xlabel('Height (cm)', 'FontSize', 12, 'FontWeight', 'bold');
ylabel('Weight (kg)', 'FontSize', 12, 'FontWeight', 'bold');
% 设置图形属性
ax = gca;
ax.FontSize = 10;
ax.FontWeight = 'bold';
ax.GridAlpha = 0.3;
ax.GridLineStyle = ':';
box off;
在修改后的代码中,我们使用linspace
函数生成身高数据,从150到190之间均匀分布。然后,根据身高生成体重数据,并加入随机噪声。这样生成的数据会更加符合线性关系。
通过上述代码,我们进行了以下调整和优化:
- 使用
linspace
函数生成均匀分布的身高数据,确保线性关系。 - 根据身高数据生成体重数据,并添加随机噪声来增加数据的多样性。
- 调整了散点图的样式,设置小球的填充颜色为淡蓝色,边缘颜色为黑色。
- 修改了标题和标签的字体大小和粗细,使其更加易读和突出。
- 设置了图形属性,包括坐标轴的字体大小和粗细,网格线的透明度和线型,去除了图框的边界。
3.4 数据分类标记
当数据具有分类属性时,我们可以使用不同的标记符号或颜色来区分不同的数据类别。
代码分析:
-
创建数据:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; y = [2, 4, 3, 1, 5, 7, 6, 9, 8, 10]; categories = ['A', 'A', 'B', 'B', 'A', 'B', 'A', 'B', 'B', 'A'];
在这一部分,我们定义了x和y坐标的数据,以及对应的数据分类categories。这些数据将用于后续的散点图绘制。
-
设置分类对应的颜色和标记符号:
colorMap = containers.Map({'A', 'B'}, {[0.8500, 0.3250, 0.0980], [0.3010, 0.7450, 0.9330]}); markerMap = containers.Map({'A', 'B'}, {'o', 'd'});
这部分代码使用了Matlab中的容器对象Map,用于将数据分类与对应的颜色和标记符号进行关联。在这个示例中,我们定义了’A’对应的颜色为橙色,'B’对应的颜色为天蓝色;'A’对应的标记符号为圆形,'B’对应的标记符号为星形。
-
绘制散点图:
figure; hold on; for i = 1:length(x) scatter(x(i), y(i), 100, 'MarkerFaceColor', colorMap(categories(i)), 'MarkerEdgeColor', 'k', 'Marker', markerMap(categories(i))); end hold off;
在这一部分,我们创建了一个新的图形窗口,并使用循环遍历每个数据点。通过调用scatter函数,我们绘制了每个数据点,并根据其对应的分类从colorMap和markerMap中获取相应的颜色和标记符号。'MarkerFaceColor’参数用于设置数据点的填充颜色,'MarkerEdgeColor’参数用于设置数据点的边界颜色,'Marker’参数用于设置数据点的标记符号。
-
添加标题和标签:
title('Scatter Plot with Data Categories'); xlabel('X'); ylabel('Y');
在最后一部分,我们使用title函数为散点图添加了标题,使用xlabel和ylabel函数分别设置了x和y轴的标签。
完整代码:
% 创建数据
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
y = [2, 4, 3, 1, 5, 7, 6, 9, 8, 10];
categories = ['A', 'A', 'B', 'B', 'A', 'B', 'A', 'B', 'B', 'A'];
% 设置分类对应的颜色和标记符号
colorMap = containers.Map({'A', 'B'}, {[0.8500, 0.3250, 0.0980], [0.3010, 0.7450, 0.9330]});
markerMap = containers.Map({'A', 'B'}, {'o', 'd'});
% 绘制散点图
figure;
hold on;
for i = 1:length(x)
scatter(x(i), y(i), 100, 'MarkerFaceColor', colorMap(categories(i)), 'MarkerEdgeColor', 'k', 'Marker', markerMap(categories(i)));
end
hold off;
% 添加标题和标签
title('Scatter Plot with Data Categories');
xlabel('X');
ylabel('Y');
3.5 动态散点图
在某些情况下,我们希望能够动态地更新散点图以反映实时数据的变化。这在监测和实时数据分析中非常有用。
% 创建初始数据
x = [];
y = [];
% 创建散点图
h = scatter(x, y);
title('Dynamic Scatter Plot');
xlabel('X');
ylabel('Y');
xlim([0, 10]);
ylim([0, 10]);
% 更新数据并刷新散点图
while true
% 生成随机数据点
new_x = rand() * 10;
new_y = rand() * 10;
% 添加新数据点
x = [x, new_x];
y = [y, new_y];
% 更新散点图数据
set(h, 'XData', x, 'YData', y);
% 延时一段时间
pause(0.5);
end
在这个例子中,我们首先创建了空的x和y数组,并绘制了一个空的散点图。然后,我们进入一个循环,每次循环中生成随机的数据点,并将其添加到x和y数组中。通过使用set
函数更新散点图的数据,我们实现了动态更新的效果。最后,使用pause
函数进行一段时间的延迟,以控制更新的速度。
3.6 案例分析
我为你准备了一个更加丰富有趣的案例:探索电影评分与票房的关系。
在这个案例中,我们将使用通过程序生成的虚拟数据,模拟电影评分与票房之间的关系,并绘制散点图来进行可视化分析。
步骤 1: 生成虚拟数据
首先,我们需要一些数据来绘制散点图。让我们生成一些虚拟数据来模拟小球的评分、票房和大小。请记住,这只是为了演示目的,所以不用太认真哦!
% 生成虚拟数据
num_balls = 100;
ratings = 5 + 1.5 * rand(num_balls, 1); % 小球的评分在5~6.5之间
box_office = 1000000 + 5000000 * rand(num_balls, 1); % 小球的票房在100万到600万之间
sizes = 20 + 80 * rand(num_balls, 1); % 小球的大小在20到100之间
在这段代码中,我们使用rand
函数生成了一些随机数来模拟小球的评分、票房和大小。评分在5到6.5之间变化,票房在100万到600万之间变化,大小在20到100之间变化。
步骤 2: 科研绘图风格配色方案
好了,我们有了数据,接下来让我们来为我们的散点图选择一套科研绘图风格的配色方案。这样可以使我们的图形更加美观且符合科研绘图的风格。
% 科研绘图风格配色方案
colors = jet(num_balls);
这里,我们使用了jet
函数来生成一套包含多个颜色的配色方案。num_balls
变量是我们小球的数量,所以我们希望有足够多的颜色来区分每个小球。
步骤 3: 绘制散点图
现在,让我们开始绘制散点图吧!准备好你的眼睛,因为即将展现的图形将令你瞠目结舌!
% 绘制散点图
scatter(ratings, box_office, sizes, colors, 'filled', 'MarkerEdgeColor', 'k');
这段简短的代码就可以绘制出令人赞叹的散点图!scatter
函数是绘制散点图的绝佳选择。我们传入评分、票房、大小和颜色的参数,并设置'filled'
选项来填充小球,'MarkerEdgeColor'
选项来设置小球边界的颜色为黑色。
步骤 4: 添加标题和标签
让我们给我们的图形添加一些标题和标签,这样观众们就不会迷失在数据的海洋中了。
% 添加标题和标签
title('Rating vs. Box Office', 'FontWeight', 'bold', 'FontSize', 14);
xlabel('Ratings', 'FontWeight', 'bold', 'FontSize', 12);
ylabel('Box Office (USD)', 'FontWeight', 'bold', 'FontSize', 12);
这段代码使用title
、xlabel
和ylabel
函数分别添加标题和横纵轴的标签。我们还设置了一些选项,如'FontWeight'
和'FontSize'
,以使标题和标签更加醒目。
步骤 5: 添加趋势线
嘿,你知道吗?我们还可以向散点图添加趋势线,这样我们就可以更好地了解数据的走势了。
% 添加趋势线
coefficients = polyfit(ratings, box_office, 1);
x_fit = min(ratings):0.1:max(ratings);
y_fit = polyval(coefficients, x_fit);
hold on;
plot(x_fit, y_fit, 'r--', 'LineWidth', 2);
hold off;
在这段代码中,我们使用polyfit
函数拟合评分和票房之间的线性趋势线。然后,我们使用polyval
函数计算趋势线上的点的坐标。最后,我们使用plot
函数绘制出这条趋势线,并设置颜色为红色,线型为虚线,线宽为2。
步骤 6: 添加数据标签
让我们进一步提升可读性!我们可以为每个小球添加一个数据标签,这样我们就可以更清楚地知道它们是谁了。
% 添加数据标签
for i = 1:num_balls
text(ratings(i)+0.05, box_office(i), ['Ball ', num2str(i)], 'FontSize', 8, 'Color', colors(i, :));
end
这段简单的循环代码将为每个小球添加一个数据标签。text
函数用于在指定位置绘制文本,我们设置了文本的位置为评分和票房的坐标加上一些微小的偏移量,以免标签与小球重叠。我们还设置了文本的字体大小为8,颜色与对应小球的颜色相同。
步骤 7: 设置图形属性
为了使我们的图形更加完美,我们还可以设置一些图形属性。这样,我们的散点图就会更加专业和吸引人!
% 设置图形属性
ax = gca;
ax.FontSize = 10;
ax.FontWeight = 'bold';
ax.GridAlpha = 0.3;
ax.GridLineStyle = ':';
box off;
这段代码使用gca
函数获取当前的坐标轴对象,并将其保存在变量ax
中。然后,我们可以通过修改ax
的属性来设置图形的字体大小、字体粗细、网格的透明度和线型。最后,我们使用box off
函数去除图形的边框,使其更加简洁。
在这个例子中,我们生成了100部电影的虚拟数据,其中电影评分在5到6.5之间,票房在100万到600万之间。然后,我们使用这些数据绘制了散点图,并添加了趋势线来显示评分与票房之间的整体关系。
此外,我们还在每个数据点上添加了电影的编号,以便更好地展示每部电影的位置。
通过这个案例,我们可以探索电影评分与票房之间的大致关系,并进一步分析高评分电影是否在票房上表现更好,以及是否存在一些异常值。这样的可视化分析有助于电影行业的市场研究和决策。
完整代码:
% 生成虚拟数据
num_balls = 100;
ratings = 5 + 1.5 * rand(num_balls, 1); % 小球的评分在5~6.5之间
box_office = 1000000 + 5000000 * rand(num_balls, 1); % 小球的票房在100万到600万之间
sizes = 20 + 80 * rand(num_balls, 1); % 小球的大小在20到100之间
% 科研绘图风格配色方案
colors = jet(num_balls);
% 绘制散点图
scatter(ratings, box_office, sizes, colors, 'filled', 'MarkerEdgeColor', 'k');
% 添加标题和标签
title('Rating vs. Box Office', 'FontWeight', 'bold', 'FontSize', 14);
xlabel('Ratings', 'FontWeight', 'bold', 'FontSize', 12);
ylabel('Box Office (USD)', 'FontWeight', 'bold', 'FontSize', 12);
% 添加趋势线
coefficients = polyfit(ratings, box_office, 1);
x_fit = min(ratings):0.1:max(ratings);
y_fit = polyval(coefficients, x_fit);
hold on;
plot(x_fit, y_fit, 'r--', 'LineWidth', 2);
hold off;
% 添加数据标签
for i = 1:num_balls
text(ratings(i)+0.05, box_office(i), ['Ball ', num2str(i)], 'FontSize', 8, 'Color', colors(i, :));
end
% 设置图形属性
ax = gca;
ax.FontSize = 10;
ax.FontWeight = 'bold';
ax.GridAlpha = 0.3;
ax.GridLineStyle = ':';
box off;
结论
通过本教程,我们详细介绍了在Matlab中绘制散点图的方法和技巧。从基础绘图开始,我们逐步学习了如何自定义样式和颜色,以及如何添加趋势线、数据分类标记和绘制动态散点图。通过案例分析,我们展示了散点图在实际数据分析中的应用。希望这个教程能够帮助你全面了解Matlab绘制散点图的方法,并激发你在数据可视化方面的创造力。
本节涉及所有代码:
%%
% 创建数据
x = randn(100, 1);
y = randn(100, 1);
% 绘制散点图
scatter(x, y);
% 添加标题和标签
title('Simple Scatter Plot');
xlabel('X');
ylabel('Y');
%%
% 创建数据
x = randn(100, 1);
y = randn(100, 1);
sizes = 30 + 100 * rand(1, 100);
colors = rand(1, 100);
% 绘制散点图
scatter(x, y, sizes, colors, 'filled');
% 添加标题和标签
title('Customized Scatter Plot');
xlabel('X');
ylabel('Y');
% 添加网格
grid on;
%%
% 生成数据
n = 100; % 数据点数量
heights = linspace(150, 190, n); % 生成身高数据,从150到190之间均匀分布
weights = heights * 0.6 + randn(1, n) * 5; % 根据身高生成体重数据,加入随机噪声
colors = rand(n, 3); % 生成随机颜色向量
% 绘制散点图
scatter(heights, weights, 60, colors, 'filled');
% 添加趋势线
hold on;
coefficients = polyfit(heights, weights, 1);
fitted_values = polyval(coefficients, heights);
plot(heights, fitted_values, 'r-', 'LineWidth', 2);
hold off;
% 添加标题和标签
title('Relationship between Height and Weight', 'FontSize', 14, 'FontWeight', 'bold');
xlabel('Height (cm)', 'FontSize', 12, 'FontWeight', 'bold');
ylabel('Weight (kg)', 'FontSize', 12, 'FontWeight', 'bold');
% 设置图形属性
ax = gca;
ax.FontSize = 10;
ax.FontWeight = 'bold';
ax.GridAlpha = 0.3;
ax.GridLineStyle = ':';
box off;
%%
% 创建数据
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
y = [2, 4, 3, 1, 5, 7, 6, 9, 8, 10];
categories = ['A', 'A', 'B', 'B', 'A', 'B', 'A', 'B', 'B', 'A'];
% 设置分类对应的颜色和标记符号
colorMap = containers.Map({'A', 'B'}, {[0.8500, 0.3250, 0.0980], [0.3010, 0.7450, 0.9330]});
markerMap = containers.Map({'A', 'B'}, {'o', 'd'});
% 绘制散点图
figure;
hold on;
for i = 1:length(x)
scatter(x(i), y(i), 100, 'MarkerFaceColor', colorMap(categories(i)), 'MarkerEdgeColor', 'k', 'Marker', markerMap(categories(i)));
end
hold off;
% 添加标题和标签
title('Scatter Plot with Data Categories');
xlabel('X');
ylabel('Y');
%%
% 创建初始数据
x = [];
y = [];
% 创建散点图
h = scatter(x, y);
title('Dynamic Scatter Plot');
xlabel('X');
ylabel('Y');
xlim([0, 10]);
ylim([0, 10]);
% 更新数据并刷新散点图
while true
% 生成随机数据点
new_x = rand() * 10;
new_y = rand() * 10;
% 添加新数据点
x = [x, new_x];
y = [y, new_y];
% 更新散点图数据
set(h, 'XData', x, 'YData', y);
% 延时一段时间
pause(0.5);
end
%%
% 生成虚拟数据
num_balls = 100;
ratings = 5 + 1.5 * rand(num_balls, 1); % 小球的评分在5~6.5之间
box_office = 1000000 + 5000000 * rand(num_balls, 1); % 小球的票房在100万到600万之间
sizes = 20 + 80 * rand(num_balls, 1); % 小球的大小在20到100之间
% 科研绘图风格配色方案
colors = jet(num_balls);
% 绘制散点图
scatter(ratings, box_office, sizes, colors, 'filled', 'MarkerEdgeColor', 'k');
% 添加标题和标签
title('Rating vs. Box Office', 'FontWeight', 'bold', 'FontSize', 14);
xlabel('Ratings', 'FontWeight', 'bold', 'FontSize', 12);
ylabel('Box Office (USD)', 'FontWeight', 'bold', 'FontSize', 12);
% 添加趋势线
coefficients = polyfit(ratings, box_office, 1);
x_fit = min(ratings):0.1:max(ratings);
y_fit = polyval(coefficients, x_fit);
hold on;
plot(x_fit, y_fit, 'r--', 'LineWidth', 2);
hold off;
% 添加数据标签
for i = 1:num_balls
text(ratings(i)+0.05, box_office(i), ['Ball ', num2str(i)], 'FontSize', 8, 'Color', colors(i, :));
end
% 设置图形属性
ax = gca;
ax.FontSize = 10;
ax.FontWeight = 'bold';
ax.GridAlpha = 0.3;
ax.GridLineStyle = ':';
box off;