【Matlab使用笔记02】绘图-利用三维热力图绘制四维数据图像

本文详细介绍了如何在Matlab中使用散点图和气泡图对四维数据进行三维热力图可视化,包括如何通过散点大小和颜色表示额外维度,以及注意事项和版本兼容性。
摘要由CSDN通过智能技术生成

最近在作图过程中需要对四维、甚至五维数据作图,二维热力图、三维散点图曲面图等等都已经无法满足这样的要求了。而且网上真正使用三维坐标轴绘制热力图的参考内容较少,大多都是二维或者其他不适用的图像,故自行探究整理了相关内容如下。

内容:使用三维散点/气泡图+属性(颜色、大小)对四维数据作图可视化。

一、利用散点图绘制三维热力图

参考文档:三维散点图 scatter3() - MathWorks

1. 使用散点大小体现第四维度数据

Preliminary】因为本文使用的是Matlab R2020,所以不能使用矩阵作为散点大小的输入,需要使用scatter3(X(:),Y(:),Z(:),sizeNum(:));(有关解释详见文末)。先明确是否是对应位置散点大小与给定矩阵的关系。
散点图(散点大小根据给定数值确定)
输出散点大小矩阵的page 1:
散点大小矩阵(z=1部分)
上图对应于散点图大小矩阵sizeNum的z=1。可以看到,坐标轴的对应(x=1:5,y=0.1:0.5,z=10:50)是没有问题的,但通过sizeNum(:)为参数绘图与其输出的结果对应方式有所不同。图中用红色方框圈出来的部分为x=5,然而在两幅图中并非完全对应。在矩阵sizeNum(:,:,1)中x=5的元素值随着y的增加依次为[16 105 38 51 8],但在三维散点图中却是y=0.5时,随着x的增加散点大小依次为[16 105 38 51 8](因为x=1,x=5对应为两个较小的点,而且x=5时对应为蓝色方框内最小的点,显然不是sizeNum(:,:,1)输出图中的y=0.5的蓝色方框内数据)。
换句话说,就是在使用sizeNum(:)为参数绘图时发生“混乱”,导致两图中红蓝方框内容不匹配。

所以,使用pagetranspose(sizeNum);% 按页转置实现三维散点图中的(x,y,z)点大小与sizeNum(x,y,z)相匹配。
在这里插入图片描述
从而能够得到【完整代码】如下:

[coorX,coorY,coorZ] = meshgrid(1:5,0.1:0.1:0.5,10:10:50);
figure;
% sizeNum = 100; %所有点使用相同的大小
sizeNum = round(rand(5,5,5)*200); %随机生成散点大小矩阵5*5*5
sizeNum2 = pagetranspose(sizeNum);% 按页转置
scatter3(coorX(:),coorY(:),coorZ(:),sizeNum2(:));
xlabel('x');ylabel('y');zlabel('z','rotation',360);
title('按页转置后的散点图');

2.使用散点颜色实现第四维数据

可以使用给定颜色、RGB三元组、或者RGB三元组矩阵等方式实现各个点的颜色不同。但是由于版本问题,使用颜色图为每个点指定不同颜色。
——先通过矩阵将各个点颜色赋数值,再使用matlab预制颜色映射方案将其对应为不同颜色,如colormap(gca,"winter")
在这里插入图片描述
代码】如下:

[coorX,coorY,coorZ] = meshgrid(1:5,0.1:0.1:0.5,10:10:50);%坐标
figure;
% color = 'r'; % (使用颜色名称)所有散点使用相同的红色
colNum = unique(rand(5,5,5)); %colNum 散点颜色值;用unique排了个序,方便观看hh
colNum1 = pagetranspose(colNum);% 按页转置
scatter3(coorX(:),coorY(:),coorZ(:),200,colNum1(:),'filled');%此时散点大小不能缺省;使用filled属性填充
colormap(gca,"jet");colorbar; %使用matlab预制的颜色映射绘图 
xlabel('x');ylabel('y');zlabel('z','rotation',360);
title('三维(散点)热力图');

3. 补充

  • 其他可修改的属性:scatter3(x,y,z,'*'),通过markertype‘*’实现将散点换成“散星”。
  • 另外,还可以通过view(-30,10)来转换 坐标轴观察角度。

二、利用气泡图绘制三维热力图

思路类似,函数语法可参考:气泡图 bubblechart() - MathWorks
在这里插入图片描述
代码】如下:

[coorX,coorY,coorZ] = meshgrid(1:5,0.1:0.1:0.5,10:10:50);
bubbleSize = round(rand(5,5,5)*100); %colNum 散点颜色值;用unique排了个序,方便观看hh
bS1 = pagetranspose(bubbleSize);% 按页转置
% 为每个气泡指定一种不同颜色。例如,指定一个向量,以从预制的颜色映射中选择
bubbleColor = unique(rand(5,5,5)); % 同样,为了好看排了个序
bC1 = pagetranspose(bubbleColor);
figure; bubblechart3(coorX(:),coorY(:),coorZ(:),bS1(:),bC1(:));
bubblesize([5 30]); % 使用 bubblesize 函数将所有气泡的直径设为 5 到 30 磅之间
colorbar;
bubblelegend('Bubble Size','Location','eastoutside'); % 添加气泡图例,显示气泡大小和人口数之间的关系。
% 默认情况下,气泡是部分透明的;下列语句将其设置为20%的不透明度。
% bc = bubblechart3(x,y,z,bS1,'MarkerFaceAlpha',0.20);

三、其他

1. 二维气泡or散点热力图

二维气泡or散点热力图可同理绘制,但作为一个能省则省的懒人,热力图 能干的活儿就不愿意再多劳心费神一点儿了哈哈哈。
如有需要,可参考Matlab论文插图绘制模板第17期—散点图(气泡) - 阿昆的科研日常的文章 - 知乎,其中还有颜色和坐标轴优化等内容。

基础使用的参考文档则可见:散点图 scatter() - MathWorks二维热力图 heatmap() - MathWorks

2. 二维热力图

heatmap(xvalues,yvalues,cdata) : 基于矩阵 cdata 创建一个热图,热图上的每个单元格对应 cdata 中的一个值;指定沿 x 轴和 y 轴显示的值的标签。
例如:

cdata = [45 60 32; 43 54 76; 32 94 68; 23 95 58];
xvalues = {'Small','Medium','Large'};
yvalues = {'Green','Red','Blue','Gray'};
h = heatmap(xvalues,yvalues,cdata);

h.Title = 'T-Shirt Orders';
h.XLabel = 'Sizes';
h.YLabel = 'Colors';

在这里插入图片描述
还可以添加语句h.ColorScaling = 'scaledcolumns';h.ColorScaling = 'scaledrows';归一化每行/每列的颜色。

其他热力图有关

3. 利用plot()线图绘制

另外,还可以利用plot的绘制类似图样,并通过线图属性改变散点形状等,(但私以为这样虽然能够达到目的但有点以戈舂米的意思,而且利用多次循环可能会降低绘图效率hh)。
Anyway,代码如下,参考来源:Matlab四维数据可视化:三维坐标和颜色

x = -5:5; y = -5:5; z = -5:5; %数据坐标轴

figure;hold on;
for ii = 1:length(x)
  for jj = 1:length(y)
    for kk = 1:length(z)
      colorDiv = x(ii)+y(jj)+z(kk); %绘图颜色依据
	%绘图颜色条件
      if colorDiv < -5
        mode = 'ro'; % ’r‘红色和’o‘形状为圈;可修改为根据RGB颜色和+*v等形状
      elseif colorDiv < 5
        mode = 'bo';
      else
        mode = 'go';
      end
      plot3(x(ii),y(jj),z(kk),mode);
      
    end
  end
end
xlabel('x');ylabel('y');zlabel('z');
grid on; view(3); hold off;

得到图像:
对坐标点所在坐标轴求和,分区域上色

4. 注意版本问题

说明:在参考官方帮助文档时候注意Matlab的版本,有的是最新版本更新过的,历史版本不支持就会报错。如:
帮助文档中说可以使用向量与矩阵的组合绘制多组点:“如果所有数据集在一个或多个维度上共用坐标,请将共用坐标指定为向量,将其他坐标指定为矩阵。该向量的长度必须与这些矩阵的维度之一相匹配。例如,绘制两个共享同一 x 坐标的数据集:

X = [1 2 3 4];
Y = [4 5 6 7; 8 9 10 11];
Z = [10 11 12 13; 14 15 16 17];
scatter3(X,Y,Z);

甚至指定 X、Y 和 Z 为相同大小的矩阵绘制多个数据集:

X = [1 3 5 6; 2 4 6 8];
Y = [10 25 45 61; 20 40 60 70];
Z = [12 5 6 8; 9 13 2 7];
scatter3(X,Y,Z)

但实际上,这是R2024版本支持的功能,至少R2022a之后才能够接受向量和矩阵的组合作为坐标一次性可视化多个数据集。懒惰不爱更新的绿色用户使用的R2020版本就会报错:
在这里插入图片描述

结语

至此,关于使用散点or气泡图实现三维热力图绘制四维数据信息的内容应该基本够用了。
不难发现,理论上可以结合大小和颜色同时画出五维数据!实际上,在Matlab绘图(三)散点图—四维数据、五维数据、六维数据、七维数据散点图可视化绘制中博主ONERYJHHH通过多种属性实现更高维数据的可视化,如有需要可用作参考。
但其中有一个观点也深有同感 值得思考:绘图之前需要仔细想想,自己是否真的需要在一张图上绘制4-7维度?是否能通过更加简单明了的方式体现想要的结论,而不是一味“炫技”,过犹不及。

  • 16
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用MATLAB绘制三维热力图,你可以按照以下步骤操作: 1. 首先,准备你的数据。你需要有一个矩阵,其中的值表示热图上的每个点的温度。确保矩阵的维度是正确的,且与你希望在热力图上显示的坐标范围相对应。 2. 在MATLAB中创建一个新的图形窗口,使用`figure`命令。可以指定窗口的大小和标题等参数。 3. 使用`surf`函数创建一个三维曲面图,该图将被转换为热力图。将你的数据矩阵作为输入参数传递给该函数。 4. 使用`colormap`函数选择合适的颜色映射方案。你可以从MATLAB提供的预定义的颜色映射方案中选择,或者创建一个自定义的颜色映射。 5. 使用`colorbar`函数添加一个颜色条到图形中,以便于解读热力图中的颜色与温度之间的对应关系。 6. 如果需要,可以使用`xlabel`、`ylabel`和`zlabel`函数为坐标轴添加标签,以便于解读图形。 7. 使用`title`函数添加一个图形标题,简要描述热力图的内容。 8. 随着数据点数量的增加,热力图可能会变得混乱不易读取。如果需要,你可以使用`view`函数调整视图角度和方向,以便于更好地解读热力图。 9. 最后,使用`axis`函数调整坐标轴的范围,以确保热力图的显示不会超出预期的范围。 完成上述步骤后,你就可以使用MATLAB绘制出一个三维热力图,该图可以直观地展示你提供的数据点的温度分布情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值