首页 文章

如何在Matlab中用圆而不是直线轴绘图?

提问于
浏览
5

我有一组3个数据集,我想在MATLAB中绘制,但是'x'轴,我想以圆形而不是直底线形式给出 . 有什么想法怎么做?

一个示例图:

alt text http://img526.imageshack.us/img526/5420/busvoltageplot.jpg

在MATLAB中绘制的正常命令是 plot(x, data1, x data2, x, data3) ,其中x轴被视为直线 . 我希望x轴取圆圈 . 有没有人知道它的命令 .

4 回答

  • 4

    @Alok问你是否想要一个极地情节 . 我告诉你,你确实想要一个极地情节!有关函数 polar() 及其关系,请参阅Matlab文档,例如 cart2pol . 根据您的具体要求(我没有按照您的链接),您可能会发现准确生成您想要的图表相对容易或相当困难 .

  • 1

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

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

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

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

    基本思路:如果你有一个系列 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
    

    option1

    选项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
    

    option2


    我应该提到 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
    
  • 7

    您可以找到here所有可用的MATLAB 2-D和3-D绘图功能 .

  • 5

    对不起,如果这可能不是你问题的正确答案(你已经有很多) . 我最近发现了非常强大的绘制圆圈的工具 - CIRCOS:http://mkweb.bcgsc.ca/circos/看看,数字真是太棒了 . 它's not Matlab-based, but Perl, and it'是免费的 . 可能你会发现它很有用 .

相关问题