【问题标题】:How can I change the colour of a line, mid-plot, in matlab?如何在matlab中更改一条线的颜色,中间图?
【发布时间】:2015-09-29 04:59:51
【问题描述】:

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

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

这是我正在生成的情节:

图形的轨迹部分由以下代码生成:

[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] 值更改为某个缩放值。

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

编辑:

这里是一些示例数据:

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 值的图表:

【问题讨论】:

  • 正如我在answer 中详细介绍的那样,我建议使用(薄)表面而不是线条,您可以完全控制线条的着色方式(包括 flat 或 @987654330 @过渡)。然后最重要的是,您可以添加一个scatter 图,它还可以让您控制每个点的颜色/形状/大小。
  • 如果您坚持使用线条,则需要分别绘制每个子轨迹,并(在每次迭代中通过某个循环)从一些颜色查找表中分配一种颜色,这些颜色映射到您的轨迹强度.这在R 中更容易做到,顺便说一句。
  • 您能添加一小组样本数据吗? (请张贴minimal reproducible example)。

标签: matlab plot


【解决方案1】:

您可以通过复制所有二维输入向量(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)

当然,您可以选择最适合您需求的颜色图(非常渐进的颜色图或非常鲜明的颜色图)。这 2 种颜色图更适合于不同类型的阴影。

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

  • shading flat => 一种纯色表示整行,或者
  • shading interp => 两个锚点之间的颜色渐变。

下面是 2 个不同颜色图(hsvgray)的 16 种颜色的示例,具有不同的着色设置。


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

如果您想进一步控制点,您可以忘记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)

文档:

【讨论】:

  • 感谢您的回复,我可以让它与随机颜色一起正常工作,但我无法完全弄清楚如何生成边缘(i,j)为特定值的 c 向量。 . 我将用一小组 4 点图的数据更新我的问题
【解决方案2】:

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

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 作为根对象句柄。)

【讨论】:

  • 有趣(或不是:-)),在 Matlab 2012 下,set 命令失败。我在彩虹上看到了很多不同的颜色。 groot 可能在 2015 年之前的版本中不存在。
  • @CarlWitthoft,是的,groot 对象是相对较新的。尝试改用0set(0,'defaultAxesColorOrder', c);
  • @Hoki 谢谢,我编辑了答案以使用0 而不是groot,因为0 至少在2015a 中仍然有效。
  • @Tokkot,很好。由于您正在修改您的帖子,您可能会明确提及这一点。类似“如果您的 Matlab 版本 > 2014b,建议(MathWorks)使用 groot 而不是 0 作为根对象句柄”
猜你喜欢
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多