Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 带有gnuplot或倍频程的3D直方图_Matlab_Gnuplot_Histogram_Octave - Fatal编程技术网

Matlab 带有gnuplot或倍频程的3D直方图

Matlab 带有gnuplot或倍频程的3D直方图,matlab,gnuplot,histogram,octave,Matlab,Gnuplot,Histogram,Octave,为了表示我的数据,我想用gnuplot或octave绘制一个3D直方图。 假设我有一个以下格式的数据文件: 2 3 4 8 4 10 5 6 7 我想在集合[1,3]x[1,3]中绘制九个矩阵大小的彩色条,这样条的颜色与条的高度成比例。我该怎么做呢?你看过吗 稍微调整一下: Z=[2 3 4 8 4 10 5 6 7]; % input data figure; h = bar3(Z); % get handle to graphics for k=1:numel

为了表示我的数据,我想用gnuplot或octave绘制一个3D直方图。 假设我有一个以下格式的数据文件:

2 3 4    
8 4 10    
5 6 7
我想在集合[1,3]x[1,3]中绘制九个矩阵大小的彩色条,这样条的颜色与条的高度成比例。我该怎么做呢?

你看过吗

稍微调整一下:

Z=[2 3 4
   8 4 10
   5 6 7]; % input data
figure; 
h = bar3(Z); % get handle to graphics
for k=1:numel(h), 
    z=get(h(k),'ZData'); % old data - need for its NaN pattern
    nn = isnan(z); 
    nz = kron( Z(:,k),ones(6,4) ); % map color to height 6 faces per data point 
    nz(nn) = NaN; % used saved NaN pattern for transparent faces 
    set(h(k),'CData', nz); % set the new colors
end
colorbar;
下面是你在最后得到的:

我没有八度音阶,但我相信这应该可以做到:

Z = [2 3 4
     8 4 10
     5 6 7];

[H W] = size(Z);

h = zeros( 1, numel(Z) ); 
ih = 1;
for ix = 1:W
    fx = ix-.45;
    tx = ix+.45;
    for iy = 1:W
        fy = iy-.45;
        ty = iy+.45;      

        vert = [ fx fy 0;...
            fx ty 0;...
            tx fy 0;...
            tx ty 0;...
            fx fy Z(iy,ix);...
            fx ty Z(iy,ix);...
            tx fy Z(iy,ix);...
            tx ty Z(iy,ix)];
        faces = [ 1 3 5;...
            5 3 7;...
            7 3 4;...
            7 8 4;...
            5 6 7;...
            6 7 8;...
            1 2 5;...
            5 6 2;...
            2 4 8;...
            2 6 8];

        h(ih) = patch( 'faces', faces, 'vertices', vert, 'FaceVertexCData', Z(iy,ix),...
            'FaceColor', 'flat', 'EdgeColor','none' );
        ih = ih+1;
    end
end
view( 60, 45 );
colorbar;

我认为下面的方法应该可以奏效。我没有使用比彩色地图、冲浪和补丁更复杂的东西,据我所知,它们都应该像八度音阶一样工作

守则:

%# Your data
Z = [2 3 4
    8 4 10
    5 6 7];


%# the "nominal" bar (adjusted from cylinder())
n = 4;
r = [0.5; 0.5];
m = length(r);
theta = (0:n)/n*2*pi + pi/4;

sintheta = sin(theta); sintheta(end) = sqrt(2)/2;

x0 = r * cos(theta);
y0 = r * sintheta;
z0 = (0:m-1)'/(m-1) * ones(1,n+1);

%# get data for current colormap
map = colormap;
Mz = max(Z(:));
mz = min(Z(:));

% Each "bar" is 1 surf and 1 patch
for ii = 1:size(Z,1)
    for jj = 1:size(Z,2)

        % Get color (linear interpolation through current colormap)
        cI = (Z(ii,jj)-mz)*(size(map,1)-1)/(Mz-mz) + 1;
        fC = floor(cI);
        cC = ceil(cI);
        color = map(fC,:) + (map(cC,:) - map(fC,:)) * (cI-fC);

        % Translate and rescale the nominal bar
        x = x0+ii;
        y = y0+jj;
        z = z0*Z(ii,jj);

        % Draw the bar
        surf(x,y,z, 'Facecolor', color)
        patch(x(end,:), y(end,:), z(end,:), color)

    end
end
结果:

我如何生成标称条是基于MATLAB的圆柱体代码。一件很酷的事情是,你可以很容易地制作出更时髦的酒吧:

这是通过改变

n = 4;
r = [0.5; 0.5];
进入


仅使用倍频程中可用的函数的解决方案,通过测试

此解决方案以与Matlabs hist3d函数内部类似的方式生成曲面

简言之:

创建具有4个点的曲面,每个点的高度为 值,该值打印在每个存储箱边缘。 每个箱子都由零包围,这些零也绘制在每个箱子边缘。 颜色设置为基于箱子值,并应用于 4个点和周围的零。使“条”的边缘和顶部的颜色与高度相匹配。 对于以矩阵形式给出的数据,包含代码中的bin高度bin_值:

代码

输出


下面是我实现的一个函数,部分用作替换

在我的版本中,这些条是通过创建:我们构建一个矩阵来呈现的

我们的想法是首先构建一个3d立方体作为模板,然后复制它,复制尽可能多的条。每个条都会根据其位置和高度进行移动和缩放

顶点/面矩阵以矢量化方式构造,无循环!,结果是为所有条绘制一个面片,而不是多个面片,每个条一个面片,这在效率方面更有效

该函数可以通过使用扩展数据、YData、ZData和CData属性(而不是顶点和面属性)指定形成多边形的连接顶点的坐标来实现。事实上,bar3内部就是这样做的。这种方法通常需要更大的数据来定义面片,因为我们不能在面片面上共享点,尽管在我的实现中我不太关心这一点。下面是一个例子,我试图解释由bar3构建的数据结构

我的妈妈3.m 请注意,我选择将所有的条用一种与函数输出类似的纯色着色,而MATLAB则用匹配的颜色强调矩阵的列

但这很容易理解;下面是一个使用以下方法匹配bar3的示例:

或者说您想使用以下方法为条形图上色:

请注意,在上一个示例中,将影响渐变的外观。在MATLAB中,“OpenGL”渲染器将沿RGB颜色空间插值颜色,而其他两个渲染器“Painters”和“ZBuffer”将跨当前使用的颜色贴图的颜色进行插值,因此直方图条看起来像是穿过jet调色板的迷你色条,与从底部的蓝色到定义高度的任何颜色的渐变相反,如上图所示。有关更多详细信息,请参阅

我已经在Octave中测试了这个函数,并且都在Windows上运行,效果很好。如果你运行我上面展示的示例,你会发现一些高级3D功能在倍频程中还没有正确实现,包括透明度、照明等。。。此外,我还使用了倍频程中不可用的函数(如薄膜和螺旋)来构建示例矩阵,但这些函数对代码来说并不重要,只需用您自己的数据替换它们即可:


使用interp2和最近邻插值将数据从3×3重采样到300×300,然后使用surf怎么样?@Dan你为什么添加了matlab标签?@TomFenech matlab和Octave共享相同的语法和函数,matlab有一个更大的SO社区,因此应该可以增加获得好结果的机会solution@Dan我没有意识到他们如此相似。我想,如果可以肯定一个有效的MATLAB答案也适用于Octave,那就足够了。@TomFenech不确定,但这很可能是MATLAB的最佳解决方案-但看起来bar3不适用于Octave:@Dan-你能检查Octave吗?我也没有安装Octave。我通常在这里检查:但它并不总是绘制图表。虽然没有错,但这很有希望。你能解释一下你的面矩阵吗?@Dan a face是一个顶点列表,我怀疑octave不支持非平面面,因此这里所有的面都是三角形3个顶点。每个面都有一行面
在垂直方向索引三行。因此,面[1 3 5]是一个连接第一、第三和第五顶点的三角形。我没有八度要检查。好的,我明白了,它是每小节10个三角形-谢谢。@Dan:你能验证这在八度音阶或其在线版本上是否正确吗?在线版本上没有错误,但我无法检查它是否绘制正确。我会怀疑,如果它不出错,那么它确实工作,但我恐怕我不能真正检查。看起来是一个很好的解决方案!fwiw,我有一个黄色的大盒子,里面有这个代码。@StevenLu你有什么MATLAB版本?我没有。使用八度音阶。我希望它能在MATLAB上完美运行。太棒了。但是为什么不将颜色条按高度合并为函数的C-data额外参数?@Dan:你的意思是你想将函数称为my_bar3Z,C,其中C是一个与Z大小相同的矩阵,用于给颜色条着色?我想这是可以做到的,但我尝试复制的bar3并没有提供这样的语法。另外,我不想处理所有可能的调用选项,因为这会使代码太长。我们必须检查C是否通过,如果C=Z缺失,我们是假设C=Z,还是应该对所有条使用单一颜色?另外,还要决定是使用C来指定渐变,还是使用C来指定具有平坦颜色的条。。至少我在示例中展示了一些方法:我的想法更像我的_bar3Z,width,C,这样它仍然可以像bar3一样使用。我认为默认的C可以是一种纯色,就像你的函数现在创建的那样。我真的没有考虑渐变与实体的问题…@Dan:好的,这里有一种可能的方法来合并颜色参数:diff/patch文件。现在,您可以通过以下方式调用该函数:my_bar3M,w默认纯色,my_bar3M,w,rand1,3和my_bar3M,w,'red'用户提供的纯色,my_bar3M,w,randsizeM使用索引映射到当前颜色映射的渐变色,或my_bar3M,w,randnumelM,3种平面颜色,每栏一行,用真彩色矩阵表示。太棒了。有没有可能在条之间添加空格/填充?不过没什么大不了的
n = 8;
r = [0.5; 0.45; 0.2; 0.1; 0.2; 0.45; 0.5];
bin_values=rand(5,4); %some random data

bin_edges_x=[0:size(bin_values,2)]; 
x=kron(bin_edges_x,ones(1,5));
x=x(4:end-2);

bin_edges_y=[0:size(bin_values,1)]; 
y=kron(bin_edges_y,ones(1,5));
y=y(4:end-2);

mask_z=[0,0,0,0,0;0,1,1,0,0;0,1,1,0,0;0,0,0,0,0;0,0,0,0,0];
mask_c=ones(5);
z=kron(bin_values,mask_z);
c=kron(bin_values,mask_c);

surf(x,y,z,c)
function pp = my_bar3(M, width)
    % MY_BAR3  3D bar graph.
    %
    % M     - 2D matrix
    % width - bar width (1 means no separation between bars)
    %
    % See also: bar3, hist3

    %% construct patch
    if nargin < 2, width = 0.8; end
    assert(ismatrix(M), 'Matrix expected.')

    % size of matrix
    [ny,nx] = size(M);

    % first we build a "template" column-bar (8 vertices and 6 faces)
    % (bar is initially centered at position (1,1) with width=? and height=1)
    hw = width / 2;    % half width
    [X,Y,Z] = ndgrid([1-hw 1+hw], [1-hw 1+hw], [0 1]);
    v = [X(:) Y(:) Z(:)];
    f = [
        1 2 4 3 ; % bottom
        5 6 8 7 ; % top
        1 2 6 5 ; % front
        3 4 8 7 ; % back
        1 5 7 3 ; % left
        2 6 8 4   % right
    ];

    % replicate vertices of "template" to form nx*ny bars
    [offsetX,offsetY] = meshgrid(0:nx-1,0:ny-1);
    offset = [offsetX(:) offsetY(:)]; offset(:,3) = 0;
    v = bsxfun(@plus, v, permute(offset,[3 2 1]));
    v = reshape(permute(v,[2 1 3]), 3,[]).';

    % adjust bar heights to be equal to matrix values
    v(:,3) = v(:,3) .* kron(M(:), ones(8,1));

    % replicate faces of "template" to form nx*ny bars
    increments = 0:8:8*(nx*ny-1);
    f = bsxfun(@plus, f, permute(increments,[1 3 2]));
    f = reshape(permute(f,[2 1 3]), 4,[]).';

    %% plot
    % prepare plot
    if exist('OCTAVE_VERSION','builtin') > 0
        % If running Octave, select OpenGL backend, gnuplot wont work
        graphics_toolkit('fltk');
        hax = gca;
    else
        hax = newplot();
        set(ancestor(hax,'figure'), 'Renderer','opengl')
    end


    % draw patch specified by faces/vertices
    % (we use a solid color for all faces)
    p = patch('Faces',f, 'Vertices',v, ...
        'FaceColor',[0.75 0.85 0.95], 'EdgeColor','k', 'Parent',hax);
    view(hax,3); grid(hax,'on');
    set(hax, 'XTick',1:nx, 'YTick',1:ny, 'Box','off', 'YDir','reverse', ...
        'PlotBoxAspectRatio',[1 1 (sqrt(5)-1)/2]) % 1/GR (GR: golden ratio)

    % return handle to patch object if requested
    if nargout > 0
        pp = p;
    end
end
subplot(121), bar3(magic(7)), axis tight
subplot(122), my_bar3(magic(7)), axis tight
M = membrane(1); M = M(1:3:end,1:3:end);
h = my_bar3(M, 1.0);

% 6 faces per bar
fvcd = kron((1:numel(M))', ones(6,1));
set(h, 'FaceVertexCData',fvcd, 'FaceColor','flat', 'CDataMapping','scaled')

colormap hsv; axis tight; view(50,25)
set(h, 'FaceAlpha',0.85)   % semi-transparent bars
M = 9^2 - spiral(9);
h = my_bar3(M, 0.8);

% use Z-coordinates as vertex colors (indexed color mapping)
v = get(h, 'Vertices');
fvcd = v(:,3);
set(h, 'FaceVertexCData',fvcd, 'FaceColor','interp')

axis tight vis3d; daspect([1 1 10]); view(-40,20)
set(h, 'EdgeColor','k', 'EdgeAlpha',0.1)