首页 文章

用一个y轴和两个x轴绘制两组数据

提问于
浏览
3

我已经阅读了几个关于为数据设置两个x轴的SO答案,以及在mathworks.com上的一些教程,但我没有看到完全如下的方法:

通常绘制数据集第一 . 在图形的顶部创建第二个x轴,但使用现有的y轴作为下一个数据集 . 绘制第二个数据集,使其控制第二个x轴(缩放等),并且不会覆盖或重新缩放现有的单个y轴 .

这样做的原因是我想基于相同的源数据集绘制两组不同的直方图值,因此频率分布的大小相似,但是bin大小/边的值是不同的 .

我的后备是对第二个数据集的x数据进行点斜率缩放,但是我仍然需要创建类似于How to insert two X axis in a Matlab a plot的第二个x轴 .

2 回答

  • 6

    您可以在第一个轴(在同一位置)上创建第二个轴,其中XAxisLocation设置为 'top' ,没有 Color ,因此它与第一个轴的链接相连's transparent, has no yticks, and has it' s YLim . 另外,我们可以链接 Position 值以确保如果我们调整其中一个轴,它们会调整大小以保持其外观 .

    figure;
    
    % Create the first axes
    hax1 = axes();
    
    % Plot something here
    xdata = 1:10;
    hplot1 = line(xdata, log(xdata));
    
    % Create a transparent axes on top of the first one with it's xaxis on top
    % and no ytick marks (or labels)
    hax2 = axes('Position', get(hax1, 'Position'), ...  % Copy position
                'XAxisLocation', 'top', ...             % Put the x axis on top
                'YAxisLocation', 'right', ...           % Doesn't really matter
                'xlim', [2 20], ...                     % Set XLims to fit our data
                'Color', 'none', ...                    % Make it transparent
                'YTick', []);                           % Don't show markers on y axis
    
    % Plot data with a different x-range here
    
    hplot2 = line(xdata * 2, log(flip(xdata)), 'Color', 'r', 'Parent', hax2);
    
    % Link the y limits and position together
    linkprop([hax1, hax2], {'ylim', 'Position'});
    
    % Draw some labels
    xlabel(hax1, 'Blue Line')
    xlabel(hax2, 'Red Line')
    ylabel(hax1, 'Some Value')
    
    % Add a legend? Why not?!
    legend([hplot1, hplot2], {'Blue', 'Red'})
    

    enter image description here

    由Carl W编辑(OP)

    当刻度间距不同于顶部和底部时,上面的代码将导致丑陋的XTicks . 我在matlab remove only top and right ticks with leaving box on找到了一个解决方法 . 我稍微修改了上面的代码

    figure
    xdata = 1:10;
    plot(xdata)
    % get handle to current axes
    hax1 = gca;
    % set box property to off 
    set(hax1,'box','off','color','white')
    
    hax2 = axes('Position', get(hax1, 'Position'),'box','off', ...  % Copy position
                'XAxisLocation', 'top', ...             % Put the x axis on top
                'YAxisLocation', 'right', ...           % Doesn't really matter           
                'Color', 'none', ...                    % Make it transparent
                'YTick', []);
    

    警告:这不适用于绘图,它将覆盖现有的轴分配 .

    由于没有 points 函数(愚蠢的MathWorks),我不得不做 line(x,y,'linestyle','none','marker','x','parent',hax2) 来获得积分 .

    hplot2 = line(5:25, log((5:25)), 'Color', 'r', 'Parent', hax2);
    
    linkprop([hax1,hax2],{'ylim','Position'});
    

    这给了
    enter image description here

  • 1

    这是我用 plotyy 做的那种hacky方式 .

    Code:-

    %Random values for axes
    BotttomXaxis = 1:10;
    Yaxis =1:3:30;
    TopXaxis = (11:20:200).^3;
    
    [ax,H1,H2]= plotyy(Yaxis,BotttomXaxis,Yaxis,TopXaxis)
    view([90 -90])
    
    % Now labeling the axes, notice carefully where I have written to write y and x labels.
    xlabel('Enter ylabel of the y-axis here')
    ylabel(ax(1), 'Enter xlabel of the bottom x-axis here');
    ylabel(ax(2), 'Enter xlabel of the top x-axis here');
    

    我觉得不需要在这里添加图例,因为轴和绘图颜色已经指示了图例 . 见下图:

    twoXaxis1

    但是,如果您仍想添加图例,可以使用以下内容:

    legend(H1,'Legend of Bottom X-axis','Location','northeast');
    legend(H2,'Legend of Top X-axis','Location','northeast');
    %Specifying the Legend location is necessary here
    

    Output:-
    twoXaxis2

相关问题