首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用x1、y1、x2、y2在同一图形中绘制数据- matlab

用x1、y1、x2、y2在同一图形中绘制数据- matlab
EN

Stack Overflow用户
提问于 2013-04-29 20:21:01
回答 2查看 2.2K关注 0票数 0

我正在尝试做一个赫茨斯普林格-罗素图,就像这样:http://en.wikipedia.org/wiki/File:HRDiagram.png我有4种不同类型的数据对应于同一个点(让我们称它为x1,y1,x2,y2),我想把它们放在同一张图中,显示4个轴(其中2个像往常一样是左下角,另外2个是右上角)。我的代码:

代码语言:javascript
运行
复制
filename = 'Hipparcos_stars2.xlsx';
sheet1 = 1;

xHRcolor = 'G2:G19920'; 
yHRmag = 'I2:I19920'; 
xHRtemp = 'J2:J19920';
yHRlum = 'K2:K19920';
HRx_c = xlsread(filename, sheet1, xHRcolor); % x1
HRy_m = xlsread(filename, sheet1, yHRmag); % y1
HRx_t = xlsread(filename, sheet1, xHRtemp); % x2
HRy_l = xlsread(filename, sheet1, yHRlum); % y2

figure(1)
ax1 = gca;
line(HRx_c,HRy_m, 'LineStyle', 'o', 'Color', 'k', 'MarkerSize', 1);
set(ax1,'ydir','reverse');

ax2 = axes('Position',get(ax1,'Position'),...
           'XAxisLocation','top',...
           'YAxisLocation','right');
line(HRx_t,log10(HRy_l),'LineStyle', 'o','Color','k','MarkerSize', 1,'Parent',ax2);
set(ax2,'xdir','reverse');

xlabel(ax1,'B-V color')
ylabel(ax1,'V Magnitude')
xlabel(ax2,'Temperature [ºK]')
ylabel(ax2,'Luminosity [log(L/Ls)]')

就像这样,我得到了一个有4个轴的图形,但关于第二组轴的信息是错误的。问题是,对于这段代码,它不会使第二组轴适应数据,并且对于我选择的任何点,它都会显示x2和y2的正确值,但x1和y1的值是错误的。你知道如何做一些类似维基百科的事情吗?提前感谢

对于Hipparcos_stars2.xlsx:http://www1.datafilehost.com/d/7d652c04

EN

回答 2

Stack Overflow用户

发布于 2013-04-29 20:34:36

您可以使用plotyy(),然后自定义外观:

代码语言:javascript
运行
复制
h = plotyy(HRx_c,HRy_m,HRx_t,HRy_l,'plot','semilogy')
set(h(1),'ydir','reverse');
set(h(2),'xdir','reverse');
票数 1
EN

Stack Overflow用户

发布于 2013-04-29 20:40:29

以下是您的代码,稍作修改即可正常工作:

代码语言:javascript
运行
复制
%# some random data
x1 = linspace(0,1,100);
y1 = exp(x1) .* cos(x1);
x2 = linspace(10,100,100);
y2 = cumsum(rand(size(x2))-0.5);

%# plot
figure
hAx(1) = axes('YDir','reverse', 'XColor','b', 'YColor','b');
hAx(2) = axes('Position',get(hAx(1),'Position'), 'XDir','reverse', ...
    'XAxisLocation','top', 'YAxisLocation','right', 'Color','none', ...
    'XColor','r', 'YColor','r');
linkprop(hAx, 'Position');
line(x1,y1, 'Color','b', 'LineStyle','none', 'Marker','o', 'MarkerSize',2, ...
    'Parent',hAx(1));
line(x2,y2, 'Color','r', 'LineStyle','none', 'Marker','.', 'MarkerSize',5, ...
    'Parent',hAx(2));
xlabel(hAx(1), 'B-V color')
ylabel(hAx(1), 'V Magnitude')
xlabel(hAx(2), 'Temperature [ºK]')
ylabel(hAx(2), 'Luminosity [log(L/Ls)]')

请注意,通过将第二个轴的颜色属性设置为'none',第二个轴是透明的。此外,绘制散点的正确方法是在使用'Marker'属性指定标记时将line属性设置为'none'

还要注意使用linkprop链接两个轴的position属性,这样如果一个轴发生更改,另一个轴也会随之更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16278509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档