我有一个看起来像这样的数据集
140400 70.7850 1
140401 70.7923 2
140402 70.7993 3
140403 70.8067 4
140404 70.8139 5
140405 70.8212 3
如果第一列对应于时间(数据点之间的一秒间隔)并且将在x轴上,则第二列对应于距离并且将在y轴上。第三列是一个数字(一到五),是运动的资格。
我想制作一个图表,根据前一个数据点的数量改变两点之间的线条颜色。例如,我希望第一个和第二个数据点之间的行为红色,因为限定值为1.
我看过很多关于根据强度值制作滑动缩放比例的帖子,但我只想要5种颜色:(红色,橙色,黄色,绿色和蓝色)。
我尝试过这样的事情:
plot(x,y,{'r','o','y','g','b'})
但没有运气。
有关如何处理此问题的任何想法?如果可能的话,不进行循环。
答案 0 :(得分:8)
你也可以使用一个适用于2014b之前的Matlab版本的技巧(至少可以追溯到2009a)。
但是,永远不会像你期望的那样简单(除非你在这里为其中一个解决方案编写一个包装器,否则你可以忘记plot(x,y,{'r','o','y','g','b'})
)。
诀窍是使用surface
而不是line
对象。曲面受益于CData
属性以及许多有用的功能来利用颜色贴图和纹理。
Matlab surf
不处理1D数据,它需要一个矩阵作为输入,所以我们只需复制每个坐标集(例如xx=[x,x]
)即可给出它。
不过不用担心,表面会像线条一样薄,所以最终的结果并不难看。
%% // your data
M=[140400 70.7850 1
140401 70.7923 2
140402 70.7993 3
140403 70.8067 4
140404 70.8139 5
140405 70.8212 3];
x = M(:,1) ; %// extract "X" column
y = M(:,2) ; %// same for "Y"
c = M(:,3) ; %// extract color index for the custom colormap
%% // define your custom colormap
custom_colormap = [
1 0 0 ; ... %// red
1 .5 0 ; ... %// orange
1 1 0 ; ... %// yellow
0 1 0 ; ... %// green
0 0 1 ; ... %// blue
] ;
%% // Prepare matrix data
xx=[x x]; %// create a 2D matrix based on "X" column
yy=[y y]; %// same for Y
zz=zeros(size(xx)); %// everything in the Z=0 plane
cc =[c c] ; %// matrix for "CData"
%// draw the surface (actually a line)
hs=surf(xx,yy,zz,cc,'EdgeColor','interp','FaceColor','none','Marker','o') ;
colormap(custom_colormap) ; %// assign the colormap
shading flat %// so each line segment has a plain color
view(2) %// view(0,90) %// set view in X-Y plane
colorbar
会得到你:
作为更一般情况的一个例子:
x=linspace(0,2*pi);
y=sin(x) ;
xx=[x;x];
yy=[y;y];
zz=zeros(size(xx));
hs=surf(xx,yy,zz,yy,'EdgeColor','interp') %// color binded to "y" values
colormap('hsv')
view(2) %// view(0,90)
将为您提供一个正弦波,其颜色与y
值相关联:
答案 1 :(得分:6)
您是否有Matlab R2014b或更高?
然后你可以使用一些undocumented features introduced by Yair Altman:
n = 100;
x = linspace(-10,10,n); y = x.^2;
p = plot(x,y,'r', 'LineWidth',5);
%// modified jet-colormap
cd = [uint8(jet(n)*255) uint8(ones(n,1))].' %'
drawnow
set(p.Edge, 'ColorBinding','interpolated', 'ColorData',cd)
答案 2 :(得分:0)
我希望的效果在下面(简化)实现:
indices(1).index = find( data( 1 : end - 1, 3) == 1);
indices(1).color = [1 0 0];
indices(2).index = find( data( 1 : end - 1, 3) == 2 | ...
data( 1 : end - 1, 3) == 3);
indices(2).color = [1 1 0];
indices(3).index = find( data( 1 : end - 1, 3) == 4 | ...
data( 1 : end - 1, 3) == 5);
indices(3).color = [0 1 0];
indices(4).index = find( data( 1 : end - 1, 3) == 10);
indices(4).color = [0 0 0];
indices(5).index = find( data( 1 : end - 1, 3) == 15);
indices(5).color = [0 0 1];
% Loop through the locations of the values and plot their data points
% together (This will save time vs. plotting each line segment
% individually.)
for iii = 1 : size(indices,2)
% Store locations of the value we are looking to plot
curindex = indices(iii).index;
% Get color that corresponds to that value
color = indices(iii).color;
% Create X and Y that will go into plot, This will make the line
% segment from P1 to P2 have the color that corresponds with P1
x = [data(curindex, 1), data(curindex + 1, 1)]';
y = [data(curindex, 2), data(curindex + 1, 2)]';
% Plot the line segments
hold on
plot(x,y,'Color',color,'LineWidth',lineWidth1)
end
答案 3 :(得分:0)
当绘制的两个变量的结果数字是圆形时,需要在z轴上添加时间。
例如,在一次实验室测试中,感应电机转子速度与电气转矩的关系如下:2d plot figure
在最后一个图中,时间点绘图的方向可以是顺时针或逆时针。由于最后一个原因,将在z轴上添加时间。
% Wr vs Te
x = logsout.getElement( 'Wr' ).Values.Data;
y = logsout.getElement( '<Te>' ).Values.Data;
z = logsout.getElement( '<Te>' ).Values.Time;
% % adapt variables for use surf function
xx = zeros( length( x ) ,2 );
yy = zeros( length( y ) ,2 );
zz = zeros( length( z ) ,2 );
xx (:,1) = x; xx (:,2) = x;
yy (:,1) = y; yy (:,2) = y;
zz (:,1) = z; zz (:,2) = z;
% % figure(1) 2D plot
figure (1)
hs = surf(xx,yy,zz,yy,'EdgeColor','interp') %// color binded to "y" values
colormap('hsv')
view(2)
% %
figure(2)
hs = surf(xx,yy,zz,yy,'EdgeColor','interp') %// color binded to "y" values
colormap('hsv')
view(3)
最后我们可以查看3d表格并检测逆向是时间绘图的真实方向是:3d plot
答案 4 :(得分:0)