我有一些定义了位置和方向的向量。我可以使用下面的代码在太空中展示它们:
theta = [pi/2,-pi/2,pi/2,pi/2,pi/2,pi/2,pi/2];
r = 0.25; % magnitude (length) of arrow to plot
x = [4,3.5,3.75,4.5,8,10,12]; y = [8.5,8.2,8.3,8,9,10,8];
u = r * cos(theta); % convert polar (theta,r) to cartesian
v = r * sin(theta);
h = quiver(x,y,u,v,'linewidth',2);
set(gca, 'XLim', [2 15], 'YLim', [4 15]);
从图像可以清楚地看出,在某些地区,箭头数量多于其他地方。我想用颜色显示箭头,每种颜色代表箭头的密度。
有人可以帮我这么做吗?如果有连续的背景颜色显示局部密度,这也是一个很好的解决方案。
答案 0 :(得分:2)
编辑:以下是根据点的密度为绘图背景着色的一些选项。我将此编辑到我的答案的顶部,因为它实际上回答了您的问题 - 根据密度单独着色quiver
箭头!
x = rand(200,1)*10; y = rand(200,1)*10; % Set up random points
r = 1; u = r * cos(x); v = r * sin(y); % Quiver directions
colormap winter; c = colormap; % Set colourmap and assign to matrix
% Get density of points broken into a 10x10 grid
[n,~,~,binX,binY] = histcounts2(x,y,[10,10]);
% Get colour based on histogram density and chosen colormap colours
col = c(ceil(n(sub2ind(size(n), binX, binY))/max(n(:))*size(c,1)),:);
figure; hold on;
% Each quiver point must be plotted individually (slow!) because colours can
% only be applied to individual quivers. This could be sped up by plotting
% all of the same colour at once.
for ii = 1:size(x,1);
quiver(x(ii),y(ii),u(ii),v(ii),0,'color',col(ii,:));
end
输出:
注意:与下面的示例不同,您不能使用hist3
,因为您还需要它来返回bin索引。您可以尝试使用this File Exchange函数来获得相同的结果(未经测试)。
这是一个使用hist3
来获取密度的选项(在此示例中,我使用10x10网格,如调用hist3
时指定的那样)。然后使用pcolor
显示密度,使用shading interp
来平滑颜色。
注意:hist3
需要统计数据& ML工具箱,如果你有Matlab 2015b或更新版本,你可以使用标准函数histcounts2(x,y)
。
% Generate points and quiver directions
x = rand(200,1)*10; y = rand(200,1)*10;
u = r * cos(x); v = r * sin(y);
% Get density of points, format for input to pcolor
n = hist3([x,y],[10,10]); % Get density of points broken into a 10x10 grid
colx = linspace(min(x),max(x),size(n,1)+1);
coly = linspace(min(y),max(y),size(n,1)+1);
n = n'; n(size(n,2)+1,size(n,1)+1) = 0;
% Plot
figure
pcolor(colx,coly,n) % Density plot
hold on; colorbar; % Hold on for next plot and show colour bar key
quiver(x,y,u,v,'r') % Quiver plot
shading interp % Smooth plot colours
输出:
编辑:使颜色更柔和
您可以使用colormap
控制颜色。这可能是默认设置之一,或者您可以创建RGB三元组的自定义地图,并拥有您想要的任何颜色!这是一个示例,只需在上面的代码末尾调用colormap bone;
:
在自定义颜色贴图中,您可以使颜色更柔和/更少对比。
此外,您可以使用caxis
缩放绘图的颜色轴!只需致电
caxis([0,2*max(n(:))]);
在上面的代码的末尾加倍最大颜色映射值。您可以调整2
以获得所需的结果:
答案 1 :(得分:1)
这看起来不那么花哨,但指定箭头颜色作为x轴一定数量的箱子中箭头数量的函数
close all;
cm=colormap;
theta = [pi/2,-pi/2,pi/2,pi/2,pi/2,pi/2,pi/2];
r = 0.25; % magnitude (length) of arrow to plot
x = [4,3.5,3.75,4.5,8,10,12]; y = [8.5,8.2,8.3,8,9,10,8];
[n,c]=hist(x,5); %count arroes in bins
u = r * cos(theta); % convert polar (theta,r) to cartesian
v = r * sin(theta);
figure;hold on
for ii=1:numel(n) %quiver bin by bin
if n(ii)>0
if ii==1
wx=find(x<(c(ii)+(c(ii+1) - c(ii))/2)); %Which X to plot
elseif ii==numel(n)
wx=find(x>c(numel(n)-1));
else
wx=find((x>(c(ii)-(c(ii)-c(ii-1))/2)).*(x<(c(ii+1)-(c(ii+1)-c(ii))/2)));
end
indCol=ceil( (size(cm,1)*n(ii)-0) / max(n));%color propto density of arrows %in this bin
col = cm(indCol,:);%color for this bin
h = quiver(x(wx),y(wx),u(wx),v(wx),0,'linewidth',2,'color',col);
end
end
colorbar
caxis([0 max(n)])