2015-06-23 15 views
11

Chciałbym utworzyć figurę Matlaba z podwójną osią X (m/s i km/h) z tym samym polem.Jak wstawić dwie osie X w Matlabie na wykresie

znalazłem plotyy i - Matlab reposity - plotyyy, ale szukam:

  1. Podwójna oś X.
  2. Razem pod działką.

My kod jest bardzo prosta

stem(M(:, 1) .* 3.6, M(:, 3)); 

grid on 

xlabel('Speed (km/h)'); 
ylabel('Samples'); 

M(:, 1) jest prędkości (m/s) i M(:, 3) są dane.

Chciałbym tylko drugą linię, na dole, z prędkością wm/s.

+2

Jeśli można żyć z drugiej osi x na górze, a potem po prostu zastosować [** to rozwiązanie **] (http://stackoverflow.com/a/30692952/2605073) i zastępować wszystkie y zx. Jeśli * naprawdę * chcesz obydwu razem na dole, muszę Cię rozczarować, to będzie prawdziwy ból w dupie, aby zbliżyć się do akceptowalnego stylu.Polecam, skorzystaj z połączonego rozwiązania i po prostu przesuń w dół najwyższą osią w przetwarzaniu końcowym za pomocą programu inkscape, Illustrator itp. Oszczędzasz sobie wielu kłopotów. – thewaywewalk

Odpowiedz

14

Możesz zrobić coś takiego. W porównaniu do rozwiązania @ Benoit_11 używam normalnych etykiet Matlab i odnoszą się do obu osi z uchwytami, więc przypisania są wyraźne.

Example Plot

Następujący kod tworzy pustą oś x b z jednostkami m/s z nieznaczną wysokość. Następnie rzeczywisty wykres jest narysowany w drugiej osi a położonej nieco ponad innymi osiami i jednostkami km/h. Aby drukować na określonych osiach, wstaw uchwyt osi jako pierwszy argument stem. Konwersja z m/s na km/h jest bezpośrednio zapisana w wywołaniu do stem. Wreszcie, konieczne jest ustawienie wartości dwóch osi na tej samej wartości.

% experimental data 
M(:,1) = [ 0, 1, 2, 3, 4, 5]; 
M(:,3) = [12, 10, 15, 12, 11, 13]; 

% get bounds 
xmaxa = max(M(:,1))*3.6; % km/h 
xmaxb = max(M(:,1));  % m/s 


figure; 

% axis for m/s 
b=axes('Position',[.1 .1 .8 1e-12]); 
set(b,'Units','normalized'); 
set(b,'Color','none'); 

% axis for km/h with stem-plot 
a=axes('Position',[.1 .2 .8 .7]); 
set(a,'Units','normalized'); 
stem(a,M(:,1).*3.6, M(:,3)); 

% set limits and labels 
set(a,'xlim',[0 xmaxa]); 
set(b,'xlim',[0 xmaxb]); 
xlabel(a,'Speed (km/h)') 
xlabel(b,'Speed (m/s)') 
ylabel(a,'Samples'); 
title(a,'Double x-axis plot'); 
+0

Dodałem funkcję do twojego kodu dla 'xlim'. Piszę: 'XT = [min (get (a, 'XTick')) max (get (a, 'XTick'))];' i po ustawieniu limitów za pomocą 'set (a, 'xlim', XT) ; 'i' set (b, 'xlim', XT./3.6); '. Przy tej operacji nie zmuszam min 'xlim' do zera. –

+0

Wyjaśnienie kodu: W ten sposób druga pusta oś X (b, m/s) z prawie zerową wysokością (1e-12) jest narysowana pod tą używaną dla faktycznego wykresu. Zwróć uwagę, że pozycje obu osi są ustawione ręcznie tak, aby miały tę samą pozycję i szerokość x, ale inną pozycję y (a jest ustawione powyżej b). W każdym przypadku, należy pamiętać, że musisz użyć górnej osi dla swoich działek, nawet jeśli musisz najpierw przekonwertować wartości x. – MakisH

+0

@MakisH To prawda. Właśnie dodałem wyjaśnienie. – Matt

-1

Najlepszym sposobem mogę myśleć, aby to zrobić jest użycie 2 działki, na przykład, można podzielić działkę na dużym i małym przekroju robiąc coś takiego:

subplot(100, 1, 1:99) // plot your graph as you normally would 
plot(... 

subplot(100, 1, 100) // Plot a really small plot to get the axis 
plot(...) 
b = axis() 
axis([b(1:2), 0, 0]) // set the y axis to really small 

To jest niesprawdzone, być może trzeba trochę pokręcić, ale mam nadzieję, że postawimy cię na dobrej drodze.

6

Jako bardzo prostą alternatywę można również utworzyć drugą oś (przezroczystą) i umieścić ją poniżej pierwszej, tak aby widoczna była tylko oś X.

Przykład:

clear 
clc 
close all 

x = 1:10; 

x2 = x/3.6; 

y = rand(size(x)); 

hP1 = plot(x,y); 

a1Pos = get(gca,'Position'); 

%// Place axis 2 below the 1st. 
ax2 = axes('Position',[a1Pos(1) a1Pos(2)-.05 a1Pos(3) a1Pos(4)],'Color','none','YTick',[],'YTickLabel',[]); 

%// Adjust limits 
xlim([min(x2(:)) max(x2(:))]) 

text(2.85,0 ,'m/s','FontSize',14,'Color','r') 
text(2.85,.05 ,'km/h','FontSize',14,'Color','r') 

wyjściowa:

enter image description here

Następnie można ręcznie dodać etykiety X dla każdej jednostki, w innym kolorze, na przykład.

Powiązane problemy