2013-04-29 4 views
0

Я пытаюсь сделать диаграмму Hertzsprung-Russell, подобную этой: http://en.wikipedia.org/wiki/File:HRDiagram.png У меня есть 4 разных типа данных для одной и той же точки (позволяет звонить it x1, y1, x2, y2), и я хочу объединить все это на одном графике, показывая 4 оси (2 из них внизу и слева, как обычно, а остальные 2 сверху и справа). Мой код:, строя данные с x1, y1, x2, y2 на том же рисунке - matlab

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 оси, но с неправильной информацией о втором наборе оси. Дело в том, что с этим кодом он не адаптирует второй набор оси к данным, и для любой точки i выбирает, он представляет правильные значения x2 и y2, но неправильные значения x1 и y1. Любая идея о том, как сделать что-то вроде википедии? Заранее спасибо

для Hipparcos_stars2.xlsx: http://www1.datafilehost.com/d/7d652c04

+1

Ваш вопрос НЕ относится к MATLAB. Это проблема масштабирования в астрономических единицах (я не могу здесь помочь). Для каждого, чтобы увидеть, что происходит, попробуйте следующий код: 'subplot (211) line (HRx_c, HRy_m, 'LineStyle', 'o', 'Color', 'k', 'MarkerSize', 1); set (gca, 'ydir', 'reverse'); subplot (212) line (HRx_t, log (HRy_l), 'LineStyle', 'o', 'Color', 'k', 'MarkerSize', 1); set (gca, 'xdir', 'reverse'); ' – Oleg

+0

Если у вас есть Google, вы можете найти: http://www.princeton.edu/~rvdb/images/NJP/HRdiagMatlab.html. Существует некоторый код MATLAB, и преобразование не просто 'log10()'. – Oleg

ответ

1

Вы можете использовать plotyy(), а затем настроить внешний вид:

h = plotyy(HRx_c,HRy_m,HRx_t,HRy_l,'plot','semilogy') 
set(h(1),'ydir','reverse'); 
set(h(2),'xdir','reverse'); 
+0

привет! спасибо за ваш ответ, но мне нужны две оси x и оси 2 y. plotyy просто делает оси 2 y. –

+0

Да, ты прав. Здесь документация показывает [Использование нескольких осей x и y] (http://www.mathworks.co.uk/help/matlab/creating_plots/using-multiple-x-and-y-axes.html), что и есть Amro в его ответе. – Oleg

+0

да, это то, что у меня есть в моем коде. дело в том, что этот код хорош, когда у вас есть 2 набора данных и вы хотите построить его на одном графике. таким образом он показывает две линии по одной оси, а другую по отношению к второстепенным осям. но у меня есть только один набор данных с 4 типами информации. –

1

Вот ваш код с небольшими изменениями, чтобы сделать его работу:

%# 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)]') 

screenshot

Обратите внимание, что вторая ось сделана прозрачной, установив ее свойство цвета 'none'. Также правильным способом рисования разброса точек является установка свойства линии 'none' при указании маркера с использованием свойства 'Marker'.

Также обратите внимание на использование linkprop для связывания свойства позиции обеих осей, таким образом, если один из них изменен, другой следует.

+0

эй! :) спасибо за ваш ответ, но я все еще не работаю должным образом. например, он показывает 2 набора данных, один «прикрепленный» к синим осям, а другой - к красной оси. Мне нужно построить только один набор данных, «прикрепленных» к 4-ой оси одновременно, так как каждая точка имеет информацию обо всех четырех осях. –

+0

yes Я намеренно установил два разных цвета, чтобы показать, что есть только 2 оси выше. Я не уверен, к какому 4 осям вы ссылаетесь. – Amro

+0

Вы имеете в виду, что каждая точка в ваших данных 4-мерная? – Amro

Смежные вопросы