首页 文章

如何在matlab中更改线条中间图的颜色?

提问于
浏览
2

是否可以在matlab中更改线条的颜色,中间图?

我正在开发matlab中的蚁群优化算法,我希望能够将不同路径的轨迹强度表示为可视化中的不同颜色

这是我正在生成的情节:

ACO graph

图表的跟踪部分由以下代码生成:

[Xt,Yt] = gplot(trails,XY,'-w'); % gplot does not allow custom colours
plot(Xt,Yt,'-o','Color',[0.75,0.75,0.75],...
    'MarkerFaceColor',[0.75,0.75,0.75],'LineWidth',2);

我有一个包含每条边的强度值的矩阵,我希望能够根据线强度将线颜色的[0.75,0.75,0.75]值更改为某个缩放值 .

有没有办法通过使颜色值成为某个变量的函数来做到这一点?或者我必须单独绘制每一条线?

EDIT:

这是一些示例数据:

NODES: 4
<node x,y coords>
N1(10,10)
N2(82,19)
N3(38,77)
N4(30,150)

EDGES: 4
<edges connecting Na and Nb, T is intended greyscale luminance value>
E1(N1,N2) - T = 0.7  
E2(N1,N3) - T = 0.3
E3(N2,N3) - T = 0.6
E4(N3,N4) - T = 0.4

以下是具有随机T值的图表:

tiny test graph

2 回答

  • 3

    您可以通过复制所有2D输入向量( xy )来使用看起来像 linesurface ,以便有矩阵 . 这些矩阵可用于生成 surface 对象,由于 CData 属性,可以对线和点颜色进行更多控制 .

    首先,我必须生成样本数据:

    %% // sample gplot data (from matlab documentation example)
    reset(groot) %// optional, only if you modified the default groot properties previoulsly
    k = 1:30;
    [B,XY] = bucky;
    [xt, yt] = gplot( B(k,k),XY(k,:) ) ;
    
    %% // sample custom properties (point/line colors)
    nColor = 16 ;                    %// to start with low number of colors
    c = randi([1 nColor],size(xt)) ; %// random colors for each point
    

    现在我们有一组点和一个标量值(强度或其他任何东西)在显示屏上进行颜色编码 . 我们可以使用 surface 对象在一个图形对象中考虑所有这些参数:

    %% // create 'Matrix' style input from 2D line data
    X = [xt,xt] ;                       %// replicate column vector "xt"
    Y = [yt,yt] ;                       %// same for "yt"
    C = [c c] ;                         %// replicate column vector "c"
    Z = zeros(size(X)) ;                %// Z plane = 0
    
    %% // DISPLAY - Surf only
    figure
    hs = surf(X,Y,Z,C,'EdgeColor','interp','FaceColor','none','Marker','*','LineWidth',1.5) ;
    colormap(hsv(nColor)) %// choose a more distintive colormap (any other colormap will work)
    colorbar
    view(2)
    

    当然,您可以选择最适合您需求的色彩图(非常渐进的色彩图或非常清晰) . 这两种类型的色彩映射将更适合不同类型的着色 .

    您还可以选择如何处理每行的颜色信息:

    • shading flat =>整行的一种纯色,或

    • shading interp =>两个锚点之间的颜色渐变 .

    以下是使用不同着色设置的2种不同色彩图( hsvgray )的16种颜色的示例 .
    enter image description here


    这应该可以让你最大程度地控制线条的外观,只需要处理一个图形对象(当然你总是可以单独绘制每一条线并设置自定义属性,但是你需要一个循环和很多图形对象) .

    如果您想进一步控制点,可以忘记 surface 对象的标记,并叠加 scatter 图来显示点 . 这将为您提供关于点外观的额外选项 . 下面是如何执行此操作的快速示例,请查看 scatter 文档以获取更多用法示例 .

    %% // DISPLAY - Surf and Scatter
    figure
    hs = surf(X,Y,Z,C,'EdgeColor','interp','FaceColor','none','Marker','none') ;
    hold on
    hp = scatter(xt,yt,25,c,'filled','LineWidth',1.5) ;
    colormap(hsv(nColor)) %// choose a more distintive colormap (any other colormap will work)
    colorbar
    view(2)
    

    文档:

  • 1

    您可以通过操作 ColorOrder 属性使用 plot 命令执行此操作:

    A = rand(10) > .5;
    xy = rand(10,2);
    [xt, yt] = gplot(A, xy);
    
    c = bone(size(xt,1)/3); % your colors here
    
    set(0,'defaultAxesColorOrder', c);
    plot(reshape(xt, 3, []), reshape(yt, 3, []));
    

    重塑的结果是你获得了许多线对象而不是单个对象,如果你有很多节点,这可能会很慢 .

    (如果您有Matlab版本> 2014b,MathWorks建议使用 groot 而不是 0 作为根对象句柄 . )

相关问题