如何为不同区间绘制具有不同颜色的函数图形?

3
我有一个典型的场景,其中有一个向量X和向量Y。向量X包含递增的值,例如X = [1 1 1 2 2 3 4 4 4 4 4]。向量Y包含与X相同大小的实数值。我希望绘制索引Vs Y图,并对相应索引处不同X值的每个值进行颜色变化。
例如,绘图应该为前3个值为1的颜色1,接下来2个值为2的颜色2,1个值为3的颜色3,等等。
请问有人能帮我吗?

1
请参考https://dev59.com/X3E95IYBdhLWcg3wHqWl,其中有几个建议。 - mtrw
2个回答

4

在Laurent的回答的基础上,并且实现了您的“Index vs Y”要求,

建议如下操作:(点击此处查看Laurent的回答)
function color_plot(data_vector, color_vector)
styles={'ro','g.','bx','kd'};
hold off;
for i=unique(color_vector)
    thisIdx=find(color_vector==i);
    thisY=data_vector(color_vector==i);
    thisStyle=styles{mod(i-1,numel(styles))+1}; 
    plot(thisIdx,thisY,thisStyle);
    hold on;
end
hold off;

我的版本还允许任意大的颜色索引;如果你没有定义足够的样式,它会回到原点并重新使用颜色。
更新:注意,我必须在计算中修复上面的符号thisStyle
测试如下:
X = [1 1 1 2 2 3 4 4 4 4 4];
Y=rand(size(X))
color_plot(Y,X)

现在提供

这里输入图片描述


我喜欢你的代码(比我的紧凑多了!)。但是当与线条一起使用时,它会显示出段之间的一些间隙(即“r-”样式)。 - Laurent'
不错 - 我的代码并没有尝试将这些片段连接起来...如果这样做的话,代码就不会那么紧凑了 ;-). - Jonas Heidelberg

3
一个plot()函数选项可能会更好(也许已经存在)。
这里是一个解决方法:
function colorPlot( data_vector, colors_vector)
%PLOTCOL plots data_vector with colors found in colors_vector

Styles=[{'r-'} {'g-'} {'b-'} {'k-'}];


last_off=0;
last_data=0;
for i=unique(colors_vector)
    data_segment=data_vector(colors_vector==i);
    len=length(data_segment);
    if last_off==0
        hold off;
        plot( data_segment, 1:len,char(Styles(i)));
        last_off=len;
    else
        plot([last_data data_segment],last_off:last_off+len,char(Styles(i)));
        last_off=last_off+len;
    end
    last_data=data_segment(len);
    hold on;
end
hold off;
end

调用方式如下:

colorPlot(Y,X);

在这个版本中修复了一些错误(颜色段现在是连续的,最终绘制值与索引之间的关系)。 - Laurent'
嗯...当有人说“绘制aY的图形”时,对于你来说,a在y轴上,而Y在x轴上吗?我理解恰好相反... - Jonas Heidelberg
@JonasHeidelberg "绘制 a vs. Y",实际上是的,我假设 a 是纵坐标,Y 是横坐标。(但我不是母语人士,也许我错了) - Laurent'
我也不是母语使用者。让我们等待看看@Learner是否告诉我们他想要什么:-)。无论如何,重要的是要注意我们两个解决方案中的x和y已经交换了位置... - Jonas Heidelberg
@JonasHeidelberg 嗯,我正在寻找简单的逻辑来绘制数值。我不介意是x vs y还是y vs x。感谢两个答案。 - Learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接