如何在Matlab中用圆代替直线轴绘图?

如何在Matlab中用圆代替直线轴绘图?,matlab,plot,polar-coordinates,Matlab,Plot,Polar Coordinates,我有一组3个数据集,我想在MATLAB中绘制,但是x轴,我想以圆的形式给出,而不是直线的底线。你知道怎么做吗 示例图: 在MATLAB中绘图的常规命令是plot(x,data1,x data2,x,data3),其中x轴作为直线。我想把x轴当作一个圆。有人知道它的命令吗?@Alok问你是否需要极坐标图。我告诉你你想要一个极坐标图!有关函数polar()及其关系,如cart2pol,请参阅Matlab文档。根据您的具体要求(我没有遵循您的链接),您可能会发现精确生成所需的绘图相对容易或相当困难

我有一组3个数据集,我想在MATLAB中绘制,但是x轴,我想以圆的形式给出,而不是直线的底线。你知道怎么做吗

示例图:


在MATLAB中绘图的常规命令是
plot(x,data1,x data2,x,data3)
,其中x轴作为直线。我想把x轴当作一个圆。有人知道它的命令吗?

@Alok问你是否需要极坐标图。我告诉你你想要一个极坐标图!有关函数
polar()
及其关系,如
cart2pol
,请参阅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

选择2


我应该提到,
normalize()
是一个自定义函数,它只执行最小-最大规格化(
(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

对不起,如果这不是你问题的正确答案(你已经有很多了)。我最近发现了一个非常强大的工具,可以在圆圈上绘图:
看一看,数字真是惊人。它不是基于Matlab的,而是Perl,而且是免费的。也许你会发现它很有用。

你想要极坐标图吗。你的链接不起作用。你在重新设计轮子……polar()做了你想做的大部分事情。我想我的意图是生成一个与OP给出的图非常相似的图。即使你使用polar(),您仍然需要了解如何正确缩放/移动数据,因为POLAR始终将数据映射到从中心到外圆的整个范围。。。
%# 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
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