2015-06-23 9 views
11

मैं एक ही प्लॉट के साथ एक डबल एक्स अक्ष (एम/एस और किमी/एच) के साथ एक मैटलैब आंकड़ा बनाना चाहता हूं।एक मैटलैब में दो एक्स अक्ष डालने के लिए कैसे एक साजिश

मैं plotyy और पाया है - मैटलैब reposity में - plotyyy, लेकिन मैं देख रहा हूँ:

  1. एक डबल एक्स अक्ष।
  2. साजिश के नीचे एक साथ।

मेरे कोड बहुत सरल है:

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

grid on 

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

M(:, 1) गति (m/s में) है, और M(:, 3) डाटा नहीं है।

मैं मैसर्स में गति के साथ, नीचे केवल एक दूसरी पंक्ति चाहूंगा।

+2

आप, शीर्ष पर दूसरा x- अक्ष के साथ रह सकते हैं तो बस लागू [** इस समाधान **] (http://stackoverflow.com/a/30692952/2605073) और स्थानापन्न सभी y एक्स के साथ यदि आप वास्तव में नीचे दोनों को एक साथ चाहते हैं, तो मुझे आपको निराश करने की ज़रूरत है, यह स्वीकार्य फैशन के करीब पहुंचने के लिए गधे में असली दर्द होगा।मैं अनुशंसा करता हूं कि लिंक किए गए समाधान का उपयोग करें और पोस्ट प्रोसेसिंग में इंकस्केप, इलस्ट्रेटर इत्यादि के साथ शीर्ष अक्ष को नीचे ले जाएं। आप स्वयं को बहुत परेशानी बचाते हैं। – thewaywewalk

उत्तर

14

आप निम्न की तरह कुछ कर सकते हैं। @ Benoit_11 के समाधान की तुलना में मैं सामान्य मैटलैब लेबल का उपयोग करता हूं और दोनों अक्षों को हैंडल के साथ संदर्भित करता हूं ताकि असाइनमेंट स्पष्ट हो।

Example Plot

निम्नलिखित कोड इकाइयों m/s एक नगण्य ऊंचाई के साथ के साथ एक खाली x- अक्ष b पैदा करता है। इसके बाद, वास्तविक साजिश दूसरी अक्षों a में अन्य अक्षों के ऊपर स्थित है और इकाइयों किमी/एच के साथ स्थित है। एक विशिष्ट axes पर साजिश करने के लिए, axes-handle को stem के पहले तर्क के रूप में डालें। एम/एस से किमी/एच से रूपांतरण सीधे पर कॉल में लिखा गया है। अंत में, xlim-दोनों अक्षों की समानता को समान मानों पर सेट करने की आवश्यकता है।

% 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

मैंने आपके कोड में 'xlim' के लिए एक सुविधा डाली है। मैं लिखता हूं: 'एक्सटी = [मिनट (प्राप्त करें (ए,' एक्सटिक ')) अधिकतम (प्राप्त करें (ए,' एक्सटिक '))];' और जब मैं 'सेट (ए,' एक्सलिम ', एक्सटी) के साथ सीमा निर्धारित करता हूं ; 'और' सेट (बी, 'xlim', एक्सटी //.6.6); '। इस ऑपरेशन के साथ मैं न्यूनतम 'xlim' को शून्य पर मजबूर नहीं करता हूं। –

+0

कोड स्पष्टीकरण: इसके साथ, वास्तविक शून्य के लिए उपयोग की जाने वाली एक के तहत लगभग शून्य ऊंचाई (1e-12) के साथ एक दूसरा खाली एक्स-अक्ष (बी, एम/एस) खींचा जाता है। कृपया ध्यान दें कि दोनों अक्षों की स्थिति मैन्युअल रूप से एक ही एक्स-स्थिति और चौड़ाई रखने के लिए सेट की जाती है, लेकिन अलग-अलग वाई-स्थिति (एक बी से ऊपर सेट है)। किसी भी मामले में, ध्यान दें कि आपको अपने भूखंडों के लिए ऊपरी अक्ष का उपयोग करना होगा, भले ही आपको पहले x-values ​​को कन्वर्ट करने की आवश्यकता हो। – MakisH

+0

@MakisH यह सही है। मैंने अभी कुछ स्पष्टीकरण जोड़ा है। – Matt

-1

सबसे अच्छा तरीका है मैं इसे, 2 भूखंडों का उपयोग करने के उदाहरण के लिए क्या करने की सोच सकते हैं, आप कुछ इस तरह कर रही द्वारा एक बड़े और छोटे अनुभाग में भूखंड विभाजित कर सकते हैं:

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 

यह अपरीक्षित है, आपको थोड़ी देर के आसपास झुकाव की आवश्यकता हो सकती है लेकिन उम्मीद है कि आपको सही रास्ते पर रखा जाना चाहिए।

6

एक बहुत ही सरल विकल्प के रूप में आप एक दूसरा अक्ष (पारदर्शी) भी बना सकते हैं और इसे पहले के नीचे रख सकते हैं ताकि आप केवल एक्स अक्ष देख सकें।

उदाहरण:

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') 

आउटपुट:

enter image description here

तो आप मैन्युअल रूप से एक्स लेबल प्रत्येक यूनिट के लिए जोड़ सकते हैं, उदाहरण के लिए अलग रंग में।

संबंधित मुद्दे