Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 带单独x、y、高度和宽度值的Bar3绘图_Matlab_Plot_Matlab Figure - Fatal编程技术网

Matlab 带单独x、y、高度和宽度值的Bar3绘图

Matlab 带单独x、y、高度和宽度值的Bar3绘图,matlab,plot,matlab-figure,Matlab,Plot,Matlab Figure,发布在下方的解决方案用于使用单独的x、y值以及单独的宽度和高度值绘制条形图3 bar3(x,y,z,xWidth,yWidth) 我们目前正在进行一个项目,该项目允许在三维函数f(x,y)下可视化该区域。其目的是演示钢筋如何切割三维曲面。间接地可视化所需的积分 我们希望让这些条与曲面网格的间隔相匹配。 下面是这个想法的粗略演示 bar3只有x值的输入bar3(x,z),其中as surf有x和y的输入surf(x,y,z) 不幸的是,这正是我们得到的-这是因为bar3不能用x和y表示 代码:

发布在下方的解决方案用于使用单独的x、y值以及单独的宽度和高度值绘制条形图3

bar3(x,y,z,xWidth,yWidth)

我们目前正在进行一个项目,该项目允许在三维函数f(x,y)下可视化该区域。其目的是演示钢筋如何切割三维曲面。间接地可视化所需的积分

我们希望让这些条与曲面网格的间隔相匹配。 下面是这个想法的粗略演示

bar3只有x值的输入bar3(x,z),其中as surf有x和y的输入surf(x,y,z)

不幸的是,这正是我们得到的-这是因为bar3不能用x和y表示

代码:

clc;
cla;
d=eval(get(handles.edtOuterUpperB,'string'));
c=eval(get(handles.edtOuterLowerB,'string'));
b=eval(get(handles.edtInnerUpperB,'string'));
a=eval(get(handles.edtInnerLowerB,'string'));

n=eval(get(handles.edtInnerInterval,'string'));
m=eval(get(handles.edtOuterInterval,'string'));

h=(b-a)/n;
k=(d-c)/m;

[x,y] = meshgrid(a:h:b, c:k:d);
f=eval(get(handles.edtFunc,'string'));
surf(x,y,f);

hold on
bar3(f,1);

如果仔细观察,您将看到
XData
YData
与网格到三维条形图不同。这是因为网格使用“真实”x和y值,而条形图使用x和y值的索引

要解决此问题,您需要更改其中一个。对于您的情况,最容易更改的是曲面。实际上,您可以忽略
x
y
输入,在生成曲面时,默认情况下将使用索引的
x
y

surf(f);
surf
的文档中:

surf(Z)
使用
x=1:n
y=1:m
从矩阵
Z
中的Z分量创建三维着色曲面,其中
[m,n]=size(Z)
。高度
Z
,是在几何矩形网格上定义的单值函数
Z
指定颜色数据以及曲面高度,因此颜色与曲面高度成比例

更新 如果要在x轴和y轴上保留非索引值,则需要转换
bar3
绘图。不幸的是,MATLAB提供了一种指定x轴而不是y轴的方法。您可以采取两种方法之一

更改扩展数据

您可以获取结果条对象的
XData
属性,并将其更改为所需的数据

x = a:h:b;
y = c:k:d;

%// Anonymous function to scale things for us
scaler = @(vals)x(1) + ((vals-1) * (x(end) - x(1)) / (numel(x) - 1));

%// Create the bar plot
bars = bar3(y, f);

%// Change the XData
xdata = get(bars, 'XData');
xdata = cellfun(scaler, xdata, 'uni', 0);
set(bars, {'XData'}, xdata);
set(gca, 'xtick', x)

%// Now plot the surface
surf(x,y,f);
为了证明这一点:

x = linspace(0.5, 1.5, 5);
y = linspace(2.5, 4.5, 4);

f = rand(4,5);

scaler = @(vals)x(1) + ((vals-1) * (x(end) - x(1)) / (numel(x) - 1));
bars = bar3(y, f);


set(bars, {'XData'}, cellfun(scaler, get(bars, 'XData'), 'uni', 0))
set(gca, 'xtick', x)
axis tight

更改
xticklabel

不必更改实际数据,只需将显示的值更改为您希望的值,而不是索引值

x = a:h:b;
y = c:k:d;
labels = arrayfun(@(x)sprintf('%.2f', x), x, 'uni', 0);
bar3(y, f);
set(gca, 'xtick', 1:numel(x), 'xticklabels', labels);
hold on

%// Make sure to use the INDEX values for the x variable
surf(1:numel(x), y, f);

如果仔细观察,您将看到
XData
YData
与网格到三维条形图不同。这是因为网格使用“真实”x和y值,而条形图使用x和y值的索引

要解决此问题,您需要更改其中一个。对于您的情况,最容易更改的是曲面。实际上,您可以忽略
x
y
输入,在生成曲面时,默认情况下将使用索引的
x
y

surf(f);
surf
的文档中:

surf(Z)
使用
x=1:n
y=1:m
从矩阵
Z
中的Z分量创建三维着色曲面,其中
[m,n]=size(Z)
。高度
Z
,是在几何矩形网格上定义的单值函数
Z
指定颜色数据以及曲面高度,因此颜色与曲面高度成比例

更新 如果要在x轴和y轴上保留非索引值,则需要转换
bar3
绘图。不幸的是,MATLAB提供了一种指定x轴而不是y轴的方法。您可以采取两种方法之一

更改扩展数据

您可以获取结果条对象的
XData
属性,并将其更改为所需的数据

x = a:h:b;
y = c:k:d;

%// Anonymous function to scale things for us
scaler = @(vals)x(1) + ((vals-1) * (x(end) - x(1)) / (numel(x) - 1));

%// Create the bar plot
bars = bar3(y, f);

%// Change the XData
xdata = get(bars, 'XData');
xdata = cellfun(scaler, xdata, 'uni', 0);
set(bars, {'XData'}, xdata);
set(gca, 'xtick', x)

%// Now plot the surface
surf(x,y,f);
为了证明这一点:

x = linspace(0.5, 1.5, 5);
y = linspace(2.5, 4.5, 4);

f = rand(4,5);

scaler = @(vals)x(1) + ((vals-1) * (x(end) - x(1)) / (numel(x) - 1));
bars = bar3(y, f);


set(bars, {'XData'}, cellfun(scaler, get(bars, 'XData'), 'uni', 0))
set(gca, 'xtick', x)
axis tight

更改
xticklabel

不必更改实际数据,只需将显示的值更改为您希望的值,而不是索引值

x = a:h:b;
y = c:k:d;
labels = arrayfun(@(x)sprintf('%.2f', x), x, 'uni', 0);
bar3(y, f);
set(gca, 'xtick', 1:numel(x), 'xticklabels', labels);
hold on

%// Make sure to use the INDEX values for the x variable
surf(1:numel(x), y, f);

我们发现了一个用户贡献的函数scatterbar3,它以与bar3不同的方式实现了我们想要的功能:

然而,我们不得不纠正一个小问题:

clc;
cla;
d=eval(get(handles.edtOuterUpperB,'string'));
c=eval(get(handles.edtOuterLowerB,'string'));
b=eval(get(handles.edtInnerUpperB,'string'));
a=eval(get(handles.edtInnerLowerB,'string'));

n=eval(get(handles.edtInnerInterval,'string'));
m=eval(get(handles.edtOuterInterval,'string'));

h=(b-a)/n;
k=(d-c)/m;

[x,y] = meshgrid(a:h:b, c:k:d);
f=eval(get(handles.edtFunc,'string'));
surf(x,y,f);

hold on
bar3(f,1);
等一下

散射棒3(x,y,f,h)

散射条3没有单独的条宽和条高输入,因此当间隔不相等时会出现较大的间隙。如下所示

因此,我们编辑了scatterbar3函数,以便将条的宽度和高度作为输入:

clc;
cla;
d=eval(get(handles.edtOuterUpperB,'string'));
c=eval(get(handles.edtOuterLowerB,'string'));
b=eval(get(handles.edtInnerUpperB,'string'));
a=eval(get(handles.edtInnerLowerB,'string'));

n=eval(get(handles.edtInnerInterval,'string'));
m=eval(get(handles.edtOuterInterval,'string'));

h=(b-a)/n;
k=(d-c)/m;

[x,y] = meshgrid(a:h:b, c:k:d);
f=eval(get(handles.edtFunc,'string'));
surf(x,y,f);

hold on
bar3(f,1);
编辑的散射条3功能:

函数散射条3(X,Y,Z,widthx,widthy)
[r,c]=尺寸(Z);
对于j=1:r,
对于k=1:c,
if~isnan(Z(j,k))
牵引杆(X(j,k),Y(j,k),Z(j,k),宽度X/2,宽度Y/2)
结束
结束
结束
zlim=[min(Z(:))max(Z(:)];
如果zlim(1)>0,则zlim(1)=0;结束

如果zlim(2)我们发现了一个用户贡献的函数scatterbar3,它以与bar3不同的方式实现了我们想要的功能:

然而,我们不得不纠正一个小问题:

clc;
cla;
d=eval(get(handles.edtOuterUpperB,'string'));
c=eval(get(handles.edtOuterLowerB,'string'));
b=eval(get(handles.edtInnerUpperB,'string'));
a=eval(get(handles.edtInnerLowerB,'string'));

n=eval(get(handles.edtInnerInterval,'string'));
m=eval(get(handles.edtOuterInterval,'string'));

h=(b-a)/n;
k=(d-c)/m;

[x,y] = meshgrid(a:h:b, c:k:d);
f=eval(get(handles.edtFunc,'string'));
surf(x,y,f);

hold on
bar3(f,1);
等一下

散射棒3(x,y,f,h)

散射条3没有单独的条宽和条高输入,因此当间隔不相等时会出现较大的间隙。如下所示

因此,我们编辑了scatterbar3函数,以便将条的宽度和高度作为输入:

clc;
cla;
d=eval(get(handles.edtOuterUpperB,'string'));
c=eval(get(handles.edtOuterLowerB,'string'));
b=eval(get(handles.edtInnerUpperB,'string'));
a=eval(get(handles.edtInnerLowerB,'string'));

n=eval(get(handles.edtInnerInterval,'string'));
m=eval(get(handles.edtOuterInterval,'string'));

h=(b-a)/n;
k=(d-c)/m;

[x,y] = meshgrid(a:h:b, c:k:d);
f=eval(get(handles.edtFunc,'string'));
surf(x,y,f);

hold on
bar3(f,1);
编辑的散射条3功能:

函数散射条3(X,Y,Z,widthx,widthy)
[r,c]=尺寸(Z);
对于j=1:r,
对于k=1:c,
如果~isna