【问题标题】:Matlab surf with Different Colour Schemes具有不同配色方案的 Matlab 冲浪
【发布时间】:2012-07-01 23:56:22
【问题描述】:

我有一张地形图,我想在其中表示一些数据。见下图:

右边白色圈出的区域是绘图其余部分的单独冲浪函数。我想做的是改变配色方案。外部应该是灰度,内部应该是基于我与绘图分开的值的单一颜色。目前我已经尝试了 colormap(gray) 函数然后改变,但这改变了整个情节。

我愿意接受有关不同绘图样式的建议,即。 plot3 而不是冲浪。所以我必须制作这两个冲浪的数据是两个 x、y、z 点列表。

如果可能的话,我还想显示一个代表圆圈区域颜色的颜色条(由我根据外部值设置)。

有谁知道这样做的好方法吗?

谢谢。

编辑:

我想做的是:

图像在土堆顶部不应有深蓝色。图像将不断更新更多的“蓝色”点,颜色应根据外部值改变,理想情况下,如果它们重叠,它将与先前的点合并。

【问题讨论】:

    标签: matlab visualization


    【解决方案1】:

    由于您只想将圆圈区域设置为单一颜色,您可以将其设置为FaceColor 属性。例如:

    %# make some test data
    [xx,yy]=ndgrid(-5:0.1:5,-5:0.1:5);
    zz = exp(-xx.^2/2+-yy.^2/2);
    zz1 = zz;
    zz1(zz1>0.5)=NaN;
    zz2 = zz;
    zz2(zz2<0.5)=NaN;
    
    %# plot first surface, set colormap
    surf(zz1)
    colormap('gray')
    
    %# stretch colormap to [0 0.5]
    caxis([0 0.5])
    
    %# plot the second surface in red
    hold on
    surf(zz2,'faceColor','r')
    

    编辑

    如果您想为您的部分表面设置不同的颜色图,您需要将表面的'CData' 属性设置为颜色图的索引。要仅在颜色栏中显示单个颜色图,您可以利用颜色栏只是另一个图的事实,这意味着您可以仅显示其中的一部分,并更改标签。

    %# make some more test data
    [xx,yy]=ndgrid(-5:0.1:5,-5:0.1:5);
    zz = exp(-xx.^2/2+-yy.^2/2);
    zz1 = zz(1:50,:);
    zz2 = zz(52:end,:);
    xx1 = xx(1:50,:);xx2=xx(52:end,:);
    yy1 = yy(1:50,:);yy2=yy(52:end,:);
    
    %# create multi-colormap, set it to figure
    figure
    cmap = [gray(128);copper(128)];
    colormap(cmap)
    
    %# plot surfaces, setting the cdata property to indices 1-128 and 129-256, 
    %# respectively, in order to access the different halves of the colormap
    surf(xx1,yy1,zz1,'cdata',round(127*(zz1-min(zz1(:))/(max(zz1(:))-min(zz1(:)))))+1,'cdatamapping','direct')
    hold on
    surf(xx2,yy2,zz2,'cdata',round(127*(zz2-min(zz2(:))/(max(zz2(:))-min(zz2(:)))))+129,'cdatamapping','direct')
    
    %# find the handle to the colorbar
    %# alteratively: cbarH = findall(gcf,'tag','Colorbar')
    cbarH = colorbar;
    
    %# set limits and ticks/labels
    ylim(cbarH,[129 255])
    set(cbarH,'ytick',[129 192 255],'yticklabel',[0 0.5 1])
    

    【讨论】:

    • @Ben:看来我可能误解了你的问题——你似乎想要为表面的不同部分使用不同的颜色图。我已经添加了一个如何做到这一点的示例。
    • 谢谢你,我试图解决的问题又变得有点复杂了。我想为地图的大部分设置一个配色方案(即灰度),但中间部分应该是单一颜色,我计划继续添加这些具有不同纯色的冲浪。有什么想法吗? (颜色代表一组不同的数据,我试图通过用一系列颜色表示它来将这些数据映射到 3d 表面上,这些数据的范围从 0 到 3,并且有点连续)。
    • @Ben:我不确定我是否跟随。你是什​​么意思“中间部分”?那是表面的不同部分吗?你想让一个乐队在一个固定的高度四处走动吗?单色是什么意思?只是红色、绿色,还是黑色->绿色而不是黑色->白色的颜色图?如果您可以对示例进行 Photoshop 处理,将会很有帮助。
    【解决方案2】:

    您是否从 MATLAB 技术支持处看到了这一点?

    http://www.mathworks.com/support/solutions/en/data/1-GNRWEH/index.html

    您可以编辑colorbar 属性。

    g = colorbar;
    get(g)
    

    例如,

    % Define a colormap that uses the cool colormap and 
    % the gray colormap and assign it as the Figure's colormap.
    colormap([cool(64);gray(64)])
    
    
    % Generate some surface data.
    [X,Y,Z] = peaks(30);
    
    
    % Produce the two surface plots.
    h(1) = surf(X,Y,Z);
    hold on
    h(2) = pcolor(X,Y,Z);
    hold off
    
    
    % Move the pcolor to Z = -10.
    % The 0*Z is in the statement below to insure that the size
    % of the ZData does not change.
    set(h(2),'ZData',-10 + 0*Z)
    set(h(2),'FaceColor','interp','EdgeColor','interp')
    view(3)
    
    
    % Scale the CData (Color Data) of each plot so that the 
    % plots have contiguous, nonoverlapping values. The range 
    % of each CData should be equal. Here the CDatas are mapped 
    % to integer values so that they are easier to manage; 
    % however, this is not necessary.
    
    
    % Initially, both CDatas are equal to Z.
    m = 64; % 64-elements is each colormap
    
    
    cmin = min(Z(:));
    cmax = max(Z(:));
    % CData for surface
    C1 = min(m,round((m-1)*(Z-cmin)/(cmax-cmin))+1); 
    % CData for pcolor
    C2 = 64+C1;
    
    
    % Update the CDatas for each object.
    set(h(1),'CData',C1);
    set(h(2),'CData',C2);
    
    
    % Change the CLim property of axes so that it spans the 
    % CDatas of both objects.
    caxis([min(C1(:)) max(C2(:))])
    
    % I added these two lines
    g = colorbar
    set(g,'YLim',[1 60])
    

    最后两行是我的。其余部分来自 MATLAB 技术支持链接。它会给你一个只有一个颜色图的颜色条。如果你想要颜色图的灰色部分,那么你会做set(g,'YLim',[64 128])

    【讨论】:

    • 嘿,你能想出一种方法,只为显示器的一部分显示颜色条吗?
    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多