二、数据可视化

1. 基础绘图函数
(1) 折线图(plot)
  • 单线图:
    x = 0:0.1:2*pi;
    y = sin(x);
    plot(x, y, 'r--', 'LineWidth', 2);  % 红色虚线,线宽2
    title('Sine Wave');
    xlabel('X');
    ylabel('Y');
    grid on;
    
(2) 散点图(scatter)
  • 带颜色映射的散点图:
    scatter(data.Height, data.Weight, 50, data.Age, 'filled');
    colorbar;
    xlabel('Height');
    ylabel('Weight');
    
(3) 柱状图(bar)
  • 分组柱状图:
    categories = {'A', 'B', 'C'};
    values = [20, 35, 30; 25, 32, 34];  % 两行数据(两组)
    bar(values');
    legend('Group 1', 'Group 2');
    set(gca, 'XTickLabel', categories);
    

2. 高级可视化技巧
(1) 多子图布局(subplot)
subplot(2, 2, 1);  % 2行2列,第1个子图
plot(x, sin(x));
subplot(2, 2, 2);
plot(x, cos(x));
subplot(2, 2, 3);
scatter(rand(10,1), rand(10,1));
subplot(2, 2, 4);
bar([1 2 3], [4 5 6]);
(2) 3D 绘图
  • 3D 曲面图:
    [X, Y] = meshgrid(-2:0.1:2);
    Z = X .* exp(-X.^2 - Y.^2);
    surf(X, Y, Z);
    shading interp;  % 平滑着色
    colormap('jet');
    colorbar;
    
(3) 动态可视化(动画)
t = 0:0.1:10;
figure;
for i = 1:length(t)
    y = sin(t(i));
    plot(t(i), y, 'ro', 'MarkerSize', 10);
    xlim([0 10]);
    ylim([-1 1]);
    drawnow;  % 立即更新图形
end

3. 图形美化
(1) 设置图形属性
  • 字体与标签:
    title('My Plot', 'FontSize', 14, 'FontWeight', 'bold');
    xlabel('Time (s)', 'FontSize', 12);
    ylabel('Amplitude', 'FontSize', 12);
    
  • 坐标轴调整:
    set(gca, 'XTick', 0:2:10, 'YTick', -1:0.5:1);  % 自定义刻度
    axis([0 10 -1 1]);  % 设置坐标范围 [xmin xmax ymin ymax]
    
(2) 导出高质量图片
  • 保存为 PNG/PDF:
    exportgraphics(gcf, 'plot.png', 'Resolution', 300);  % 保存当前图形为300dpi的PNG
    

三、实战案例

案例 1:销售数据分析
  1. 数据读取与清洗:
    salesData = readtable('sales.csv');
    salesData = rmmissing(salesData);  % 删除含缺失值的行
    
  2. 按月份统计销售额:
    salesData.Month = month(salesData.Date);  % 提取月份
    monthlySales = groupsummary(salesData, 'Month', 'sum', 'Revenue');
    
  3. 绘制堆叠柱状图:
    bar(monthlySales.Month, monthlySales.sum_Revenue);
    title('Monthly Sales Revenue');
    xlabel('Month');
    ylabel('Total Revenue (USD)');
    
案例 2:传感器信号处理
  1. 读取并滤波信号:
    load('sensorData.mat');  % 包含信号向量 t 和 rawSignal
    filteredSignal = lowpass(rawSignal, 5, 100);  % 截止频率5Hz,采样率100Hz
    
  2. 绘制原始与滤波后信号对比:
    plot(t, rawSignal, 'b', t, filteredSignal, 'r', 'LineWidth', 1.5);
    legend('Raw Signal', 'Filtered Signal');
    xlabel('Time (s)');
    ylabel('Amplitude');
    

四、常见问题与调试

1. 数据维度不匹配
  • 错误示例:
    plot(x, y1, x, y2);  % 若 length(y1) ≠ length(y2),会报错
    
  • 解决:检查并统一数据长度。
2. 图形重叠显示
  • 问题:多次绘图未清除前一次图形。
  • 解决:使用 clf 或 figure 创建新窗口:
    figure;  % 新建图形窗口
    plot(x, y);
    
3. 性能优化
  • 避免循环:优先使用向量化操作或内置函数。
    % 低效
    for i = 1:length(data)
        processedData(i) = data(i) * 2;
    end
    
    % 高效
    processedData = data * 2;
    

五、学习资源推荐

  1. 官方文档:
  2. 实战练习:
    • Kaggle 数据集(如 Titanic, Iris)导入并分析。
    • 使用 MATLAB 内置数据集(如 load patients)练习可视化。

重点详解

在 MATLAB 中,plot 函数是用于绘制 二维线图 的核心函数,广泛应用于数据可视化。它可以绘制折线图、散点图(结合标记)、多曲线图等,并支持丰富的样式自定义。以下是 plot 函数的详细说明:


一、基本语法

plot(X, Y)                  % 绘制 Y 对 X 的线图
plot(X, Y, LineSpec)        % 指定线条样式、颜色、标记
plot(X1, Y1, ..., Xn, Yn)  % 在同一图中绘制多组数据
plot(___, Name, Value)      % 通过名称-值对设置属性(如线宽、颜色)

二、核心参数说明

1. 输入数据
  • X:横坐标数据(向量或矩阵)。
  • Y:纵坐标数据(向量或矩阵)。
    • 若 X 和 Y 均为向量,长度需一致。
    • 若 X 或 Y 为矩阵,按列绘制多曲线(见示例)。
2. 格式化字符串 (LineSpec)

通过字符串组合指定线条样式、颜色和标记(详见前文 'r--' 的解释):

  • 颜色:r(红)、g(绿)、b(蓝)等。
  • 线型:-(实线)、--(虚线)、:(点线)。
  • 标记:o(圆圈)、+(加号)、*(星号)等。
3. 名称-值对参数

通过键值对精细控制图形属性:

  • 'LineWidth':线条宽度(默认 0.5)。
  • 'MarkerSize':标记大小(默认 6)。
  • 'Color':颜色(RGB 三元组或颜色名称)。
  • 'MarkerFaceColor':标记填充颜色。

三、常见使用场景与示例

1. 绘制单条曲线
x = 0:0.1:2*pi;
y = sin(x);
plot(x, y, 'b-', 'LineWidth', 2);  % 蓝色实线,线宽2
title('Sine Wave');
xlabel('X');
ylabel('Y');
grid on;

2. 绘制多条曲线
(1) 多组数据多次调用 plot
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
plot(x, y1, 'r--', x, y2, 'b-.');  % 红色虚线和蓝色点划线
legend('sin(x)', 'cos(x)');
(2) 矩阵输入自动绘制多列
Y = [sin(x); cos(x)]';  % 转置为两列的矩阵
plot(x, Y);             % 自动绘制两条曲线(默认不同颜色)

3. 散点图与线图结合
x = 1:10;
y = rand(1, 10);
plot(x, y, 'o-', 'MarkerSize', 8, 'MarkerFaceColor', 'r');  % 带红色填充圆圈的线图

4. 多子图绘制 (subplot)
subplot(2, 1, 1);  % 2行1列,第1个子图
plot(x, sin(x), 'r');
title('Subplot 1');

subplot(2, 1, 2);  % 第2个子图
plot(x, cos(x), 'b');
title('Subplot 2');

四、高级功能

1. 图形属性动态修改

通过句柄 (handle) 修改已绘图形:

h = plot(x, y, 'k:');  % 获取线条句柄
set(h, 'LineWidth', 2, 'Color', 'm');  % 修改为品红色宽虚线
2. 绘制复数数据

自动绘制实部 vs. 虚部:

z = exp(1i * x);       % 复数数据
plot(z, 'g-');         % 绘制实部 vs. 虚部(单位圆)
axis equal;
3. 保存图形
saveas(gcf, 'myplot.png');          % 保存为 PNG
print('-dpdf', 'myplot.pdf');       % 保存为 PDF
exportgraphics(gcf, 'plot.jpg', 'Resolution', 300);  % 高分辨率保存

五、常见问题与调试

1. 数据维度不匹配
  • 错误示例:
    x = 1:5;
    y = [1 2 3; 4 5 6];  % y 是 2×3 矩阵
    plot(x, y);  % 报错:维度不一致
    
  • 解决:确保 x 和 y 的行数或列数匹配。
2. 图形未更新
  • 问题:循环中绘图未及时刷新。
  • 解决:在循环内添加 drawnow 强制刷新:
    for i = 1:100
        y = rand(1);
        plot(i, y, 'ro');
        drawnow;
    end
    
3. 线条样式未生效
  • 问题:格式化字符串顺序错误。
  • 正确写法:
    plot(x, y, 'ro--');  % 红色圆圈标记虚线
    

六、总结

功能描述
基础绘图绘制线图、散点图,支持多曲线叠加。
样式自定义通过 LineSpec 和名称-值对设置颜色、线型、标记、线宽等。
多子图支持使用 subplot 在单窗口排列多个图形。
图形导出支持保存为 PNG、PDF、JPEG 等格式。
动态修改通过图形句柄调整已绘制的线条属性。

掌握 plot 函数后,可以轻松实现数据可视化,直观展示数据规律!建议结合实践项目(如绘制传感器信号、统计图表等)巩固技能。

在 MATLAB 中,ismissing 函数是用于检测数据中 缺失值 的核心工具,特别适用于表格(table)、时间表(timetable)和多维数组。以下是该函数的详细讲解,涵盖语法、应用场景、示例和注意事项。


ismissing函数

一、函数语法

TF = ismissing(A)              % 检测数组 A 中的缺失值
TF = ismissing(A, indicators)  % 自定义缺失值标识符
  • 输入参数:
    • A:输入数据(支持数组、表格、时间表、字符向量、字符串、分类数组等)。
    • indicators(可选):用户自定义的缺失值标识符(如 NaN, NaT, "", 'NA' 等)。
  • 输出参数:
    • TF:与 A 维度相同的逻辑数组,true 表示对应位置是缺失值。

二、支持的缺失值类型

ismissing 函数自动识别以下标准缺失值:

数据类型标准缺失值标识符
数值数组NaN
时间数组(datetime)NaT
持续时间(duration)NaN
字符串数组""(空字符串)或 <missing>
分类数组<undefined>
表格/时间表自动检测各列的缺失值类型

三、应用场景与示例

1. 检测数值数组中的缺失值
A = [1, NaN, 3; 4, 5, NaN];
TF = ismissing(A);  
% TF = [false, true, false;
%       false, false, true]
2. 检测表格中的混合类型缺失值
% 创建包含不同数据类型的表格
data = table([1; NaN; 3], ["A"; ""; "C"], datetime([2023; NaN; 2023], 1, 1));
TF = ismissing(data);
% TF = [false, false, false;
%       true,  true,  true;   % 第二行全缺失
%       false, false, false]
3. 自定义缺失值标识符
% 检测字符串中的 'NA' 和数值中的 -1
A = table([1; -1; 3], ["OK"; "NA"; "Good"], 'VariableNames', {'Value', 'Status'});
indicators = {-1, 'NA'};  % 分别对应每列的缺失值标识符
TF = ismissing(A, indicators);
% TF = [false, false;
%       true,  true;   % 第二行被标记为缺失
%       false, false]

四、常见操作

1. 统计每列的缺失值数量
data = readtable('data.csv');
missingCount = sum(ismissing(data));
disp('各列缺失值数量:');
disp(missingCount);
2. 删除包含缺失值的行
dataClean = data(~any(ismissing(data), 2), :);  % 删除任何列有缺失的行
3. 填充缺失值
% 用列均值填充数值列
data.Value = fillmissing(data.Value, 'constant', mean(data.Value, 'omitnan'));

五、注意事项

  1. 数据类型一致性:

    • 对于字符向量(char)和字符串(string),ismissing 的行为不同:
      • char 数组的空字符 '' 不视为缺失值。
      • string 数组的空字符串 "" 视为缺失值。
  2. 混合类型表格:

    • 当处理包含多种数据类型的表格时,ismissing 会逐列检测对应类型的标准缺失值。
  3. 自定义标识符的限制:

    • 若输入为表格,indicators 必须是与列数相同的元胞数组,每个元胞定义对应列的缺失值标识符。

六、与 isnan 的区别

函数适用数据类型检测内容
ismissing支持多种类型(表格、数组)标准缺失值或自定义标识符
isnan仅数值数组仅检测 NaN

七、完整示例:数据清洗流程

% 读取数据
data = readtable('patient_data.csv');

% 检测缺失值
missingMatrix = ismissing(data);

% 统计每列缺失值比例
missingRatio = mean(missingMatrix) * 100;
disp('缺失值比例(%):');
disp(missingRatio);

% 删除缺失值超过50%的列
threshold = 50;
colsToKeep = missingRatio < threshold;
data = data(:, colsToKeep);

% 用中位数填充剩余缺失值
numericVars = varfun(@isnumeric, data, 'OutputFormat', 'uniform');
for i = find(numericVars)
    data.(i) = fillmissing(data.(i), 'constant', median(data.(i), 'omitnan'));
end

% 保存清洗后的数据
writetable(data, 'cleaned_patient_data.csv');

总结

  • 核心作用:精准定位数据中的缺失值。
  • 灵活扩展:支持自定义缺失值标识符。
  • 集成应用:与 fillmissing、rmmissing 等函数配合,构建完整数据清洗流程。

亲爱的,我把自己放在你耳边,你会听到的吧。 —木苏里

更多推荐