matlab在交互式绘图工具绘制圆,如何在Matlab中用圆而不是直线轴绘图?

以下是一个完整示例,说明如何将数据从线轴映射到圆 .

我展示了实现目标的两种方法:

三个数据系列重叠的地方(即全部映射到相同范围)

另一种选择是叠加它们(在不同的相邻范围内)

基本思路:如果你有一个系列 D ,那么将点映射到一个圆,其中半径等于数据的值,使用:

theta = linspace(0, 2*pi, N); %# divide circle by N points (length of data)

r = data; %# radius

x = r.*cos(theta); %# x-coordinate

y = r.*sin(theta); %# y-coordinate

plot(x, y, '-');

选项1

%# some random data

K = 3;

N = 30;

data = zeros(K,N);

data(1,:) = 0.2*randn(1,N) + 1;

data(2,:) = 0.2*randn(1,N) + 2;

data(3,:) = 0.2*randn(1,N) + 3;

center = [0 0]; %# center (shift)

radius = [data data(:,1)]; %# added first to last to create closed loop

radius = normalize(radius',1)'+1; %# normalize data to [0,1] range

figure, hold on

%# draw outer circle

theta = linspace(5*pi/2, pi/2, 500)'; %# 'angles

r = max(radius(:)); %# radius

x = r*cos(theta)+center(1);

y = r*sin(theta)+center(2);

plot(x, y, 'k:');

%# draw mid-circles

theta = linspace(5*pi/2, pi/2, 500)'; %# 'angles

num = 5; %# number of circles

rr = linspace(0,2,num+2); %# radiuses

for k=1:num

r = rr(k+1);

x = r*cos(theta)+center(1);

y = r*sin(theta)+center(2);

plot(x, y, 'k:');

end

%# draw labels

theta = linspace(5*pi/2, pi/2, N+1)'; %# 'angles

theta(end) = [];

r = max(radius(:));

r = r + r*0.2; %# shift to outside a bit

x = r*cos(theta)+center(1);

y = r*sin(theta)+center(2);

str = strcat(num2str((1:N)','%d'),{}); %# 'labels

text(x, y, str, 'FontWeight','Bold');

%# draw the actual series

theta = linspace(5*pi/2, pi/2, N+1);

x = bsxfun(@times, radius, cos(theta)+center(1))';

y = bsxfun(@times, radius, sin(theta)+center(2))';

h = zeros(1,K);

clr = hsv(K);

for k=1:K

h(k) = plot(x(:,k), y(:,k), '.-', 'Color', clr(k,:), 'LineWidth', 2);

end

%# legend and fix axes

legend(h, {'M1' 'M2' 'M3'}, 'location', 'SouthOutside', 'orientation','horizontal')

hold off

axis equal, axis([-1 1 -1 1] * r), axis off

165ea694-a285-4c99-ab41-cf7ed8bfe631.png

选项2

%# some random data

K = 3;

N = 30;

data = zeros(K,N);

data(1,:) = 0.2*randn(1,N) + 1;

data(2,:) = 0.2*randn(1,N) + 2;

data(3,:) = 0.2*randn(1,N) + 3;

center = [0 0]; %# center (shift)

radius = [data data(:,1)]; %# added first to last to create closed loop

radius = normalize(radius',1)'; %# normalize data to [0,1] range

radius = bsxfun( @plus, radius, (1:2:2*K)' ); %# 'make serieson seperate ranges by addition

figure, hold on

%# draw outer circle

theta = linspace(5*pi/2, pi/2, 500)'; %# 'angles

r = max(radius(:))+1; %# radius

x = r*cos(theta)+center(1);

y = r*sin(theta)+center(2);

plot(x, y, 'k:');

%# draw mid-circles

theta = linspace(5*pi/2, pi/2, 500)'; %# 'angles

r = 1.5; %# radius

for k=1:K

x = r*cos(theta)+center(1);

y = r*sin(theta)+center(2);

plot(x, y, 'k:');

r=r+2; %# increment radius for next circle

end

%# draw labels

theta = linspace(5*pi/2, pi/2, N+1)'; %# 'angles

theta(end) = [];

r = max(radius(:))+1;

r = r + r*0.2; %# shift to outside a bit

x = r*cos(theta)+center(1);

y = r*sin(theta)+center(2);

str = strcat(num2str((1:N)','%d'),{}); %# 'labels

text(x, y, str, 'FontWeight','Bold');

%# draw the actual series

theta = linspace(5*pi/2, pi/2, N+1);

x = bsxfun(@times, radius, cos(theta)+center(1))';

y = bsxfun(@times, radius, sin(theta)+center(2))';

h = zeros(1,K);

clr = hsv(K);

for k=1:K

h(k) = plot(x(:,k), y(:,k), '.-', 'Color', clr(k,:), 'LineWidth', 2);

end

%# legend and fix axes

legend(h, {'M1' 'M2' 'M3'}, 'location', 'SouthOutside', 'orientation','horizontal')

hold off

axis equal, axis([-1 1 -1 1] * r), axis off

df147bd7-f1df-4812-9434-724e45d235f0.png

我应该提到 normalize() 是一个自定义函数,它只执行minmax规范化( (x-min)/(max-min) ),定义如下:

function newData = normalize(data, type)

[numInst numDim] = size(data);

e = ones(numInst, 1);

minimum = min(data);

maximum = max(data);

range = (maximum - minimum);

if type == 1

%# minmax normalization: (x-min)/(max-min) => x in [0,1]

newData = (data - e*minimum) ./ ( e*(range+(range==0)) );

end

%# (...)

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值