2017-09-08 5 views
0

Cette question est liée à my previous post.Comment utiliser la palette de couleurs dans un tracé 3D?

Tenir compte du code ci-dessous:

%% How to plot each matrix in a cell in 3d plot(1 matrix with 1 color) ? 
% Generate Sample data cell A(1x10 cell array) 
clear; clc; 
A = cell(1,10); % cell A(1x10 cell array) 
for kk = 1:numel(A) 
    z = 10*rand()+(0:pi/50:10*rand()*pi)'; 
    x = 10*rand()*sin(z); 
    y = 10*rand()*cos(z); 
    A{kk} = [x,y,z]; 
end 

% Plot point of each matrix in one figure with different color 
figure 
hold on; 
for i = 1:numel(A)%run i from 1 to length A 

    C = repmat([i],size(A{i},1),1);%create color matrix C 
    scatter3(A{i}(:,1),A{i}(:,2),A{i}(:,3),C,'filled'); 
end 
grid on; 
view(3); % view in 3d plane 
colorbar; 

Ceci est le résultat de l'image du code ci-dessus:

output

MA QUESTION:
Si je veux utiliser « carte couleur "pour montrer la couleur correspondant au nombre de matrices, comment cela peut-il être fait?
Exemple: Dans le code affiché, je 10 matrices (A{1}, A{2}, A{3}, ..., A{10}) à l'intérieur de la cellule A, alors comment faire le colorbar montrer les 10 couleurs utilisées dans l'intrigue et comment montrer 10 numéros de 1 à 10 correspondant aux 10 couleurs utilisées dans l'intrigue (comme indiqué dans l'image)?

Répondre

1

Dans les lignes de votre code ci-dessous,

C = repmat([i],size(A{i},1),1);%create color matrix C 
scatter3(A{i}(:,1),A{i}(:,2),A{i}(:,3),C,'filled'); 

Le quatrième argument d'entrée de scatter3, que vous C nommé, ne précise pas la couleur. C'est pour spécifier la taille du cercle tracé. Juste parce que vous l'avez nommé C, MATLAB ne reconnaîtrait pas automatiquement que vous vouliez dire la couleur. Vous obtenez des couleurs différentes parce que vous tracez plusieurs points avec hold on.


venant vers votre question et la construction réelle de my previous answer,

newA = vertcat(A{:});     %Concatenating all matrices inside A vertically 

numcolors = numel(A);     %Number of matrices equals number of colors 
colourRGB = jet(numcolors);    %Generating colours to be used using jet colormap 
colourtimes = cellfun(@(x) size(x,1),A);%Determining num of times each colour will be used 
colourind = zeros(size(newA,1),1);  %Zero matrix with length equals num of points 
colourind([1 cumsum(colourtimes(1:end-1))+1]) = 1; 
colourind = cumsum(colourind);   %Linear indices of colours for newA 

scatter3(newA(:,1), newA(:,2), newA(:,3), [] , colourRGB(colourind,:),'filled'); 
%However if you want to specify the size of the circles as well as in your 
%original question which you mistakenly wrote for color, use the following line instead: 
% scatter3(newA(:,1), newA(:,2), newA(:,3), colourind , colourRGB(colourind,:),'filled'); 
grid on; 
view(3);        %view in 3d plane 
colormap(colourRGB);     %using the custom colormap of the colors we used 
%Adjusting the position of the colorbar ticks 
caxis([1 numcolors]); 
colorbar('YTick',[1+0.5*(numcolors-1)/numcolors:(numcolors-1)/numcolors:numcolors],... 
    'YTickLabel', num2str([1:numcolors]'), 'YLim', [1 numcolors]); 

qui donne le résultat suivant:

out1

Si vous voulez changer la taille des cercles vous avez fait erreur dans votre code, utilisez la ligne pertinente pour le traçage qui est mentionnée dans le code. L'utilisation de cela génère le résultat suivant:

out2