You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab中使用for循环批量绘制scatter3三维散点图问题求助

批量绘制三维散点图异常的解决方法

问题描述

我有一个41行100列的数据集,每行代表一个样本,包含已知的细胞浓度(x)、存活率(y),以及频率扫描(z)下的100组测量数据(c)。最终目标是绘制数据集的曲面图,目前先尝试绘制散点图后续再做插值处理,但用for循环批量绘制所有样本时,图形变成了颜色异常的2D散点图,单一样本的scatter3图可以正常绘制,求正确批量绘制所有样本三维散点图的方法。

模拟数据集代码

%Example 
x= randi(100,1,41); %concentration
x= transpose (x);
x= repmat (x,1, 100);

y= randi(100,1,41); %viability
y= transpose (y);
y= repmat (y,1, 100);

z= linspace(1,100,100); %frequency
z = repmat (z, 41, 1);

c= randi(100, 41,100); %measured data

%Practice plotting a single row (one sample)
figure (1)
scatter3(x(1,:),y(1,:),z(1,:),30,c(1,:),'filled');
colormap(turbo)                                
colorbar
xlabel('x')
ylabel('y')
zlabel('z')
title('Single Sample from one row')

% Plot all samples using a FOR loop
for j = 1:length(x)
    figure(2)
    hold on
    scatter3(x(j,:),y(j,:),z(j,:),30,c(j,:),'filled');
    colormap(turbo)                                
    colorbar
    xlabel('x')
ylabel('y')
zlabel('z')
    j=j+1;

end

效果图说明

  • 错误效果图(for循环批量绘制):颜色异常的2D散点图
  • 正确单样本效果图:正常的三维散点图

错误原因分析

  • 循环次数错误:length(x)针对41×100的矩阵返回的是100(矩阵的最大维度长度),而非样本数41,导致循环遍历了前100列而非41个样本
  • 冗余操作:循环内手动执行j=j+1是多余的,for循环会自动完成迭代递增
  • 重复设置绘图属性:循环内重复添加colorbar、设置坐标轴标签和colormap,会导致图形渲染混乱
  • hold on位置不合理:虽然每次循环调用figure(2)不会新建窗口,但重复开启hold on会干扰绘图状态

修正后的代码

% 模拟数据集
x= randi(100,1,41); % 细胞浓度
x= transpose(x);
x= repmat(x,1, 100);

y= randi(100,1,41); % 存活率
y= transpose(y);
y= repmat(y,1, 100);

z= linspace(1,100,100); % 频率扫描
z = repmat(z, 41, 1);

c= randi(100, 41,100); % 测量数据

% 单一样本绘制(正常)
figure(1)
scatter3(x(1,:),y(1,:),z(1,:),30,c(1,:),'filled');
colormap(turbo)                                
colorbar
xlabel('细胞浓度(x)')
ylabel('存活率(y)')
zlabel('频率(z)')
title('单一样本三维散点图')

% 修正后的批量绘制代码
figure(2)
hold on % 仅在循环前开启一次hold on
num_samples = size(x, 1); % 获取样本总数(41个)
for j = 1:num_samples
    scatter3(x(j,:),y(j,:),z(j,:),30,c(j,:),'filled');
end
% 统一设置全局绘图属性
colormap(turbo)                                
colorbar
xlabel('细胞浓度(x)')
ylabel('存活率(y)')
zlabel('频率(z)')
title('所有样本三维散点图')
hold off % 结束绘图后关闭hold状态

修正点说明

  • 用size(x,1)获取样本的行数(41),确保循环遍历所有样本
  • 将hold on、坐标轴标签、colormap、colorbar等设置移至循环外,避免重复执行导致的图形异常
  • 删除循环内冗余的j=j+1语句,依赖for循环的自动迭代
  • 循环结束后添加hold off,规范绘图环境状态

内容的提问来源于stack exchange,提问作者Alicia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:12:38