《利用 MATLAB linkaxes
函数实现子图频率轴同步缩放》
一、引言
在工程和科学研究中,常常需要同时展示信号或系统在不同频率下的多种特性,如幅值和相位。MATLAB 作为一款强大的科学计算软件,为我们提供了丰富的绘图功能。在绘制多张子图时,若能实现子图之间特定坐标轴的同步操作,将极大地提升数据观察和分析的效率。linkaxes
函数便是 MATLAB 中用于实现此功能的有效工具,它可以让不同子图的坐标轴在缩放、平移等操作上保持一致。本文将通过一个简单的示例详细介绍如何使用 linkaxes
函数实现子图频率轴的同步缩放。
二、linkaxes
函数简介
linkaxes
函数用于关联多个坐标轴的行为,其基本语法如下:
linkaxes(ax, dim)
其中,ax
是一个包含要关联的坐标轴对象的向量,dim
是指定要关联的坐标轴维度的字符串,常见取值为 'x'
、'y'
或 'z'
,分别对应关联 x
轴、y
轴或 z
轴。当 dim
为 'x'
时,对关联的坐标轴进行 x
轴方向的缩放、平移等操作时,这些坐标轴会同步变化。
三、代码示例及解释
3.1 代码示例
% 清除工作区和命令窗口
clear all;
close all;
clc;% 生成频率向量
f = logspace(0, 3, 100); % 频率范围从 1Hz 到 1000Hz
w = 2 * pi * f; % 转换为角频率% 定义传递函数(示例)
H = 1./(1 + 1j * w);% 计算幅值和相位
magnitude = abs(H);
phase = angle(H) * 180 / pi;% 创建图形窗口
figure;% 绘制幅值子图
ax1 = subplot(2, 1, 1);
semilogx(f, 20 * log10(magnitude), 'LineWidth', 1.5);
grid on;
title('Magnitude Plot');
ylabel('Magnitude (dB)');
xlim([min(f), max(f)]);% 绘制相位子图
ax2 = subplot(2, 1, 2);
semilogx(f, phase, 'LineWidth', 1.5);
grid on;
title('Phase Plot');
xlabel('Frequency (Hz)');
ylabel('Phase (degrees)');
xlim([min(f), max(f)]);% 关联两个子图的 x 轴
linkaxes([ax1, ax2], 'x');
3.2 代码详细解释
3.2.1 初始化部分
clear all;
close all;
clc;
这三行代码的作用分别是清除工作区的所有变量、关闭所有打开的图形窗口以及清空命令窗口,确保代码运行环境的干净。
3.2.2 生成频率向量
f = logspace(0, 3, 100);
w = 2 * pi * f;
使用 logspace
函数生成从 1 0 0 10^0 100(即 1Hz)到 1 0 3 10^3 103(即 1000Hz)的 100 个对数间隔的频率点,存储在变量 f
中。然后将这些频率点转换为角频率 w
,方便后续计算。
3.2.3 定义传递函数并计算幅值和相位
H = 1./(1 + 1j * w);
magnitude = abs(H);
phase = angle(H) * 180 / pi;
定义一个简单的一阶传递函数 H = 1 1 + j ω H = \frac{1}{1 + j\omega} H=1+jω1,其中 ω \omega ω 为角频率。使用 abs
函数计算传递函数的幅值,使用 angle
函数计算相位,并将相位从弧度转换为度。
3.2.4 创建图形窗口并绘制子图
figure;
ax1 = subplot(2, 1, 1);
semilogx(f, 20 * log10(magnitude), 'LineWidth', 1.5);
grid on;
title('Magnitude Plot');
ylabel('Magnitude (dB)');
xlim([min(f), max(f)]);ax2 = subplot(2, 1, 2);
semilogx(f, phase, 'LineWidth', 1.5);
grid on;
title('Phase Plot');
xlabel('Frequency (Hz)');
ylabel('Phase (degrees)');
xlim([min(f), max(f)]);
使用 figure
函数创建一个新的图形窗口。通过 subplot(2, 1, 1)
和 subplot(2, 1, 2)
分别创建两个子图,将窗口划分为上下两个区域。在第一个子图中,使用 semilogx
函数绘制对数频率坐标轴的幅值曲线,并设置曲线线宽为 1.5,添加网格、标题和 y
轴标签,同时设置 x
轴的显示范围为频率向量的最小值到最大值。在第二个子图中,同样使用 semilogx
函数绘制相位曲线,并进行类似的图形设置,同时添加 x
轴标签。
3.2.5 关联两个子图的 x
轴
linkaxes([ax1, ax2], 'x');
这行代码将幅值子图和相位子图的 x
轴关联起来。当我们在图形窗口中使用缩放工具对其中一个子图的 x
轴进行缩放操作时,另一个子图的 x
轴会自动同步缩放,方便我们同时观察不同频率下幅值和相位的变化情况。
四、总结
linkaxes
函数为 MATLAB 用户提供了一种便捷的方式来关联多个子图的坐标轴。通过使用该函数,我们可以轻松实现子图频率轴的同步缩放,使得在分析信号或系统的频率特性时更加直观和高效。无论是在教学、科研还是工程应用中,这种同步缩放功能都能帮助我们更好地理解和处理数据。在实际应用中,我们可以根据需要关联更多子图的坐标轴,以满足不同的数据分析需求。