Matlab 4D绘图提问(X,Y,Z,F(颜色))
Matlab画图 现有四列散点数据x1,y1,z1,f1,想画一个如下图所示的三维曲线图
数据大概是这样的,100 * 100 * 100个点。站里有好多利用mesh,meshc,meshz函数绘制三维网格图形的,尝试画了一下但是行不通?用Scatter3画了一个。刚开始用,在论坛里查了好久,但是没搞明白。希望有兄弟愿意指导一下思路?
我现在的初步想法是插值、网格化,再选择合适的函数画图,代码是这样滴
data = sortrows(data); % data就是原始数据,由x1,y1,z1,f1四组列向量构成
x1 = data(:,1);
y1 = data(:,2);
z1 = data(:,3);
f1 = data(:,4);
x2 = (-0.17):0.001:(-0.12);
y2 = (-0.01):0.001:(0.01);
z2 = 3.99:0.001:4.01;
[X,Y,Z] = meshgrid(x2,y2,z2);
F = griddata(x1,y1,z1,f1,X,Y,Z,'linear');
然后用新获得的这组X,Y,Z,F来画图,但是由于不知道选啥函数合适,还在试,也不知道这样处理数据会失真多少。
0
提建议
邀请回答
编辑
收藏
删除
收藏
举报
追加酬金
(90%的用户在追加酬金后获得了解决方案)
当前问题酬金
¥
15
(您已提供 ¥ 20, 还可追加 ¥
支付方式
扫码支付
加载中...
6
条回答
默认
最新
-
「已注销」
2023-03-06 20:55
关注
“Devil组”引证GPT后的撰写:
-
你的初步想法是正确的,使用插值函数griddata可以将原始散点数据转换为网格化数据,并用于绘制三维曲线图。
以下是一个可能的实现:
% 排序原始数据
data = sortrows(data);
x1 = data(:,1);
y1 = data(:,2);
z1 = data(:,3);
f1 = data(:,4);
% 定义插值网格
x2 = linspace(min(x1), max(x1), 100);
y2 = linspace(min(y1), max(y1), 100);
z2 = linspace(min(z1), max(z1), 100);
[X,Y,Z] = meshgrid(x2,y2,z2);
F = griddata(x1, y1, z1, f1, X, Y, Z, 'cubic');
% 绘制三维曲线图
figure;
p = patch(isosurface(X, Y, Z, F, 0.5));
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
daspect([1,1,1]);
view(3);
axis tight;
camlight;
lighting gouraud;
假设原始数据包含了足够的样本点,可以进行插值。如果原始数据太稀疏,插值结果可能会失真,需要更多的样本点来支撑插值结果。
这个代码用到了isosurface函数来绘制三维曲线图,可以根据需要进行调整,例如改变曲面的等值线值、曲面的颜色等等。
本回答被题主选为最佳回答
, 对您是否有帮助呢?
本回答被专家选为最佳回答
, 对您是否有帮助呢?
本回答被题主和专家选为最佳回答
, 对您是否有帮助呢?
举报
按下Enter换行,Ctrl+Enter发表内容
-
dahe0825
2023-03-06 20:55
关注
参考GPT的回答内容和自己的思路,您可以使用Matlab的surf函数来画三维曲线图。以下是基于您提供的数据和代码的一个示例:
data = sortrows(data); % data就是原始数据,由x1,y1,z1,f1四组列向量构成
x1 = data(:,1);
y1 = data(:,2);
z1 = data(:,3);
f1 = data(:,4);
% 定义插值网格
x2 = (-0.17):0.01:(-0.12);
y2 = (-0.01):0.01:(0.01);
z2 = 3.99:0.01:4.01;
[X,Y,Z] = meshgrid(x2,y2,z2);
% 用插值函数插值
F = griddata(x1,y1,z1,f1,X,Y,Z,'linear');
figure;
surf(X,Y,Z,F);
xlabel('X');
ylabel('Y');
zlabel('Z');
在这个示例中,选择了线性插值函数。请注意,您可以选择其他插值函数来更好地适应您的数据。另外,请注意,此示例中的网格大小可能需要根据您的数据进行调整。
回答不易,还请采纳!!!
本回答被题主选为最佳回答
, 对您是否有帮助呢?
本回答被专家选为最佳回答
, 对您是否有帮助呢?
本回答被题主和专家选为最佳回答
, 对您是否有帮助呢?
举报
按下Enter换行,Ctrl+Enter发表内容
「已注销」
2023-03-06 21:00
关注
参考GPT和自己的思路,你的想法是正确的,可以使用插值和网格化来生成一个新的网格数据,然后使用合适的函数来绘制图形。在这里,你可以尝试使用Matlab自带的函数,比如surf、scatter3、slice、isosurface等等。以下是一些示例代码,你可以根据自己的需要进行修改。
1 使用surf函数绘制曲面图
figure;
surf(X,Y,Z,F);
colorbar;
xlabel('x');
ylabel('y');
zlabel('z');
title('Surface Plot');
2 使用scatter3函数绘制散点图
figure;
scatter3(X(:),Y(:),Z(:),20,F(:),'filled');
colorbar;
xlabel('x');
ylabel('y');
zlabel('z');
title('Scatter Plot');
figure;
slice(X,Y,Z,F,[],[],z2);
colorbar;
xlabel('x');
ylabel('y');
zlabel('z');
title('Slice Plot');
4 使用isosurface函数绘制等值面图
figure;
isosurface(X,Y,Z,F,0.5);
axis tight;
daspect([1,1,1]);
camlight;
colorbar;
xlabel('x');
ylabel('y');
zlabel('z');
title('Isosurface Plot');
以上这些函数都可以用来绘制三维曲面图形,可以根据你的需求选择合适的函数进行使用。插值和网格化过程中可能会有一些误差,但可以尝试使用不同的插值方法,如'nearest'、'linear'、'cubic'等来比较误差的大小。
本回答被题主选为最佳回答
, 对您是否有帮助呢?
本回答被专家选为最佳回答
, 对您是否有帮助呢?
本回答被题主和专家选为最佳回答
, 对您是否有帮助呢?
举报
按下Enter换行,Ctrl+Enter发表内容
A1358722560
2023-03-06 21:20
关注
根据要求,设计了以下代码:
import matplotlib.pyplot as plt
import numpy as np
# 生成坐标点
x = np.linspace(0, 10, 40)
y = np.linspace(0, 10, 40)
z = np.linspace(0, 10, 40)
# 生成网格
X, Y, Z = np.meshgrid(x, y, z)
# 颜色映射
Color = np.sqrt(X ** 2 + Y ** 2 + Z ** 2)#可替换为你表格中的数据
# 颜色图
cmap = plt.get_cmap('RdBu')
# 绘制散点图
fig = plt.figure()
ax = plt.axes(projection='3d')
sca = ax.scatter(X, Y, Z, c=Color, cmap=cmap)
plt.colorbar(sca)
# 显示图形
plt.show()
如果问题得到解决请点 采纳~~
本回答被题主选为最佳回答
, 对您是否有帮助呢?
本回答被专家选为最佳回答
, 对您是否有帮助呢?
本回答被题主和专家选为最佳回答
, 对您是否有帮助呢?
举报
按下Enter换行,Ctrl+Enter发表内容
蓝白、波罗歌
2023-03-06 21:33
关注
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
你的处理思路是正确的,可以先进行插值处理,再使用绘图函数进行绘制。其中,griddata函数就是用来进行插值的,可以根据指定的网格位置和原始的散点数据进行插值。绘图函数可以选择surf函数或scatter3函数。
下面是具体的代码实现,其中选择了surf函数进行绘图:
% 原始数据,四列散点数据x1,y1,z1,f1
data = [x1,y1,z1,f1];
% 选择插值网格的范围
x2 = (-0.17):0.01:(-0.12);
y2 = (-0.01):0.01:(0.01);
z2 = 3.99:0.01:4.01;
% 对原始数据进行插值处理
[X,Y,Z] = meshgrid(x2,y2,z2);
F = griddata(data(:,1),data(:,2),data(:,3),data(:,4),X,Y,Z,'linear');
% 绘制图形
figure;
surf(X,Y,Z,F);
title('4D plot');
xlabel('x');
ylabel('y');
zlabel('z');
colormap(jet)
这个代码中,插值使用的是线性插值方式。你可以根据数据的特点,选择合适的插值方式。surf函数可以将插值后的图形绘制成三维曲面,颜色由F值决定。注意,F值必须在一定范围内,否则会出现渲染异常,所以需要保证F值在一定范围内。
另外,你也可以使用scatter3函数来进行绘图,代码如下:
% 绘制图形
figure;
scatter3(x1,y1,z1,[],f1,'filled');
title('4D plot');
xlabel('x');
ylabel('y');
zlabel('z');
colormap(jet)
这个代码中,使用scatter3函数将点绘制成三维散点图,用颜色表示第四维数据。需要设置颜色值为空,用f1值来进行颜色映射。你可以根据数据特点选择合适的绘图方式。
如果我的回答解决了您的问题,请采纳!
本回答被题主选为最佳回答
, 对您是否有帮助呢?
本回答被专家选为最佳回答
, 对您是否有帮助呢?
本回答被题主和专家选为最佳回答
, 对您是否有帮助呢?
举报
按下Enter换行,Ctrl+Enter发表内容