0

私は、contourf または colormap 関数を使用して、塗りつぶされた楕円をそのアークサイン (b/a) 値 (a=長軸、b=短軸) に従って色でプロットしようとしています。

clearvars -except data colheaders
close all
clc
data(:,9)=data(:,9)*pi/180; % Convers Column 9 (angle of rotation) in rad
data(:,6)=1196-data(:,6); % Reset the Y coordinate axis to bottom left

theta = 0 : 0.01 : 2*pi; % Converts phi in rad 

imax=29;
% Define colors
cvalues=asin(data(1:imax,8)./data(1:imax,7))./asin(1);
cm = colormap; % returns the current color map

% Sort and get their index to access the color array 
[~,idx] = sort(cvalues);

% Create colormap
%ColorMap=jet;

for i=1:imax

x = data(i,7)/2 * cos(theta) * cos(data(i,9)) - data(i,8)/2 * sin(theta) * sin(data(i,9)) + data(i,5);
y = data(i,8)/2 * sin(theta) * cos(data(i,9)) + data(i,7)/2 * cos(theta) * sin(data(i,9)) + data(i,6);

colorID = max(1, sum(cvalues(i) > [0:1/length(cm(:,1)):1])); 
ColorMap(i,:) = cm(colorID, :); % returns your color
hold on
% Columns (5,6) are the centre (x,y) of the ellipse
% Columns (7,8) are the major and minor axes (a,b)
% Column 9 is the rotation angle with the x axis

%% TRYING A FASTER WAY OF PLOTTING
%A(:,i)=x'; 
%B(:,i)=y';
%%
fill(x,y,ColorMap(i,:),'EdgeColor', 'None')
text(data(i,5),data(i,6),[num2str(asin(1)*180*cvalues(i)/pi)]) % Assigns number to each ellipse
end

%%
%fill(A,B,ColorMap(1:200,3)','EdgeColor', 'None')
%%

% Adds colorbar to plot
colorbar('SouthOutside')
caxis([0 90])
axis equal;
%xlim([0 7649]);
%ylim([0 15927]);
grid on;

次のような画像が得られますが、これはうまく機能すると思います。 ここに画像の説明を入力

楕円に数字を追加する代わりに、取得した角度を追加しました (円の場合は 90、非常に長い楕円の場合は 0)。これが私の実際の実験であり、数千の楕円をプロットする必要があります。それらをプロットするにはかなりの時間がかかることがわかりました。基本的にデータを記録してすべてを一度にプロットする別の方法を試したことがわかります。しかし、アドバイスがあれば、これまでのところ成功していません:)

4

1 に答える 1

0

ここでは、Matlab で組み込みのカラーマップを使用する方法を示します (完全なリストについては、こちらを参照してください)。

トリックはn x 3、n が表現したい色の数である配列を作成することです。これが楕円の数です。

次のようにカラーマップを作成できます。

MyColorMap = jet(n)); %// jet or anything listed in the link above. You can also create your own colormap.

それが、次のコードで行うことです。順序を正しくするには、値をソートしasin(b/a)て、正しい楕円の各インデックスをフェッチする必要があります。コードにはコメントが付けられているため、非常に簡単に理解できます。色の違いがよくわかるように、プロットに 4 つの楕円を追加しました。

clear
clc
close all

%// Define dummy data
data = zeros(8,9);

data(:,5) = [3;5;12;8;2;7;4;6]; % Centre location X
data(:,6) = [1; -5 ;-2; 4;2;-3;9;5]; % Centre location Y
data(:,7) = [6 ;7;8;6;1;4;2;5]; % Major Axis a
data(:,8) = [2;5;4;2;2;5;3;7]; % Minor axis b

data(:,9) = [10;40;45;90;35;70;85;110]; % Angle of rotation phi

data(:,9)=data(:,9)*pi/180; % Converts phi in rads

theta = 0 : 0.01 : 2*pi;


%// Define colors here
cvalues = asin(data(:,8)./data(:,7));

%// Sort and get their index to access the color array
[~,idx] = sort(cvalues);

%// Create colormap with the "jet" colors
ColorMap = jet(numel(cvalues));

これは「色」を含む配列です。次のようになります。

ColorMap =
                         0                         0                         1
                         0                       0.5                         1
                         0                         1                         1
                       0.5                         1                       0.5
                         1                         1                         0
                         1                       0.5                         0
                         1                         0                         0
                       0.5                         0                         0

したがって、各行は赤、青、緑 (RGB) の組み合わせを表し、プロットする楕円と同じ数の行があります。楕円を塗りつぶす:

hold all
for i=1:numel(idx)

    k = idx(i);
    x = data(k,8)/2 * cos(theta) * cos(data(k,9)) - data(k,7)/2 * sin(theta) * sin(data(k,9)) + data(k,5);
    y = data(k,7)/2 * sin(theta) * cos(data(k,9)) + data(k,8)/2 * cos(theta) * sin(data(k,9)) + data(k,6);

    fill(x,y,ColorMap(i,:))

    plot(x, y, 'LineWidth', 1);

    % Label each ellipse with a number
    text(data(i,5),data(i,6),num2str(i),'Color','k','FontSize',12)


end
axis equal;
grid on;

カラーマップで出力jet: 青は最初にプロットされた楕円で、赤は最後にプロットされた楕円です。必要に応じてカラーバーを追加できます (追加colorbar)

ここに画像の説明を入力

別のカラーマップ colormap を使用するとbone、次の結果が得られます。

ここに画像の説明を入力

それが役立つことを願っています!

于 2015-03-09T17:43:57.760 に答える