大家好,抱歉,如果这个问题真的很愚蠢。我是编程新手,需要使用MATLAB绘制以下图像 我一遍又一遍地尝试过,似乎无法理解MATLAB是如何工作的。是否有人可以帮助编写代码来绘制这样的图片并向我解释编程是如何工作的?
答案 0 :(得分:4)
我通常不会回答给我一些coodz 问题,但是绘制这个图表太诱人了。该图将几种绘图方法结合在一起:
使用patch
创建三角形。
设置轴属性以反转轴顺序并设置颜色属性以使三角形透明。这是使用set
。
使用meshgrid
生成点网格。
使用plot3
绘制积分。
使用text
显示文字。
使用line
绘制黑色垂直线并设置轴标签。
创建该三角形的最好方法是使用patch
函数。 patch
接受一组顶点以及遍历这些顶点的顺序,以及可选的面颜色。因此,代码的第一位是:
vert = [0 1 0; 1 0 0; 0 0 1];
patch('Vertices', vert, 'Faces', 1:3, 'FaceColor', 'cyan');
vert
是顶点列表。每行包含形状包含的控制点。每列是一个坐标。第一列为R
,第二列为P
,第三列为S
。因为我们的三角形中有三个点,所以有三行点。每行包含每个三角形的一个角点。记下我专门订购积分的方式。您需要以顺时针(或逆时针......直到您)顺序定义点,因为这将在以后使用。
现在看看我如何调用patch
。我们需要关注三个属性:
Vertices
由定义我们形状的点组成Faces
要求您指定哪些点以正确的顺序绘制。通过指定Faces = 1:3 --> [1 2 3]
,我按顺序绘制第一,第二和第三点。这以顺时针顺序遍历点,然后给我们填充的三角形。FaceColor
允许您指定三角形的颜色。我做了cyan
。 因此,我们首先得到这个:
......真的不那么令人印象深刻吗?
输出将是填充形状但最初将在2D中可视化....就像我们在上面看到的那样。接下来我们需要做的是旋转相机,以便正确显示三角形。此外,轴反转,与传统轴不同。我们也必须扭转它们。另外,我们可能想要制作grid
并使面部颜色透明。
您可以在此处使用此代码执行此操作:
view(3)
set(gca, 'xdir', 'reverse')
set(gca, 'ydir', 'reverse')
grid;
alpha('color')
view(3)
移动相机,使其成为3D绘图的默认MATLAB方向。我们还将x
和y
方向颠倒过来,就像情节一样。我们还使用set
并使用gca
或 G etting C urrent A xes作为情节的焦点,并在x
中设置xdir
(y
)和ydir
方向(reverse
)。我还制作grid
并设置alpha
属性以使FaceColor
透明。
这就是我们得到的:
......好吧......还不错。
我们需要提出我们的观点。您可以像上面那样使用meshgrid
执行此操作。这个平面遵循z = 1 - x - y
的等式,但是我们需要确保我们过滤掉那些小于0的值,我们不应该将它们可视化。您可以先生成meshgrid
点,然后将小于0的任何值设置为NaN
,这样就不会显示它们。为了绝对确定并避免浮点错误,我要检查的是否小于-0.1:
[X,Y] = meshgrid(0:(1/6):1);
Z = 1 - X - Y;
Z(Z < -0.01) = NaN;
上面根据您的图形生成了1/6
分辨率的点网格。
请确保hold on
,以便我们可以在同一个图表上添加更多内容,然后使用plot3
来填充这些内容:
hold on;
plot3(X, Y, Z, 'b.', 'MarkerSize', 32);
这将绘制我们的点并使它们变为蓝色。这也使得标记尺寸直径为32像素,因此我们可以更好地看待事物。
我们现在得到这个:
......不错,不错。
我们现在将NE
文本添加到图的中间。我们还想绘制从底部到底部中间的一条线:
text(0.3,0.3,0.4, 'NE');
line([1/2 1/3], [1/2 1/3], [0 1/3], 'color', 'black');
text
通过接受(x,y,z)
坐标来工作,您可以在该位置放置文字。图表的中间部分是技术(1/3,1/3,1/3)
,但如果我把它放在这里,你就不会真正看到文字。我决定把它放在(0.3,0.3,0.4)
。最后,我们将从基点到点绘制一条线。 line
带有x
,y
和z
点的向量。每列代表一个点,因此我从(1/2,1/2,0)
的基线到(1/3,1/3,1/3)
的中间画一条线。我也把这条线弄成了黑色。
最后,我要在轴上添加一些标题:
xlabel('R');
ylabel('P');
zlabel('S');
我们现在得到:
......我喜欢!
为了您的复制和粘贴乐趣,这里有您可以用来运行的完整代码并获得上图:
vert = [0 1 0; 1 0 0; 0 0 1];
patch('Vertices', vert, 'Faces', 1:3, 'FaceColor', 'cyan')
view(3)
set(gca, 'xdir', 'reverse')
set(gca, 'ydir', 'reverse')
grid
alpha('color')
[X,Y] = meshgrid(0:(1/6):1);
Z = 1 - X - Y;
Z(Z < -0.01) = NaN;
hold on;
plot3(X, Y, Z, 'b.', 'MarkerSize', 32);
text(0.3,0.3,0.4, 'NE');
line([1/2 1/3], [1/2 1/3], [0 1/3], 'color', 'black');
xlabel('R'); ylabel('P'); zlabel('S');
答案 1 :(得分:0)
您可以使用fill3(X,Y,Z,C)功能。 X,Y和Z三元组指定多边形顶点。 C指定颜色,其中C是当前颜色映射的索引的向量或矩阵,Here您可以看到如何创建此颜色向量。
如果你想要显示轴网格线,你应该使用网格。
这是一个例子:
x = [0 1 1];
y = [0 1 0];
z = [0 1 0];
c = [0 0 1];
figure(1) % open a new figure
subplot(1,1,1) % create a subplot with 1 row and 1 column and select first
fill(x,y,z,c)
grid on
hold on
PointXYZ = 0;
plot3(PointXYZ,PointXYZ,PointXYZ,'*m')
plot3函数显示一组数据点的三维图,在本例中为(0,0,0)。 '* m'定义图表线属性。
这是一个例子。要显示所有点,必须创建坐标向量,并在plot3中使用它们。