2017-08-31 2 views
1

Je veux faire une intrigue simple dans Matlab, de, disonsMatlab terrain avec partie exponentielle ou échelle logarithmique selon les valeurs de y

% data: 
x = -9:8; 
% dates: 
Y = []; 
for year = 2008:2016 
    Y = vertcat(Y,[year;year]); 
end 
M = repmat([01;06],9,1); 
D = [01]; 
vector = datetime(Y,M,D); 

plot(vector, x); 
dateaxis('x', 12); 

Maintenant, je veux soit une échelle logarithmique pour toutes les valeurs de x

x<0 

ou une échelle exponentielle pour

x>0 

mais une échelle normale pour l'autre partie de l'intrigue. La raison en est que les valeurs négatives descendent si bas qu'avec une échelle normale, les valeurs positives semblent toutes nulles. J'ai regardé l'aide mais les fonctions de semilog etc. ne m'aident pas. Aucune suggestion?

Répondre

2

Vous pouvez créer deux intrigues secondaires et les mais ensemble

% plotting 
figure; 
p1 = subplot(2,1,1); 
idx = x>=0; plot(vector(idx), x(idx)); 
p2 = subplot(2,1,2); 
idx = x<=0; plot(vector(idx), x(idx)); 
% Make x-axis limits the same (must use datenum) 
lims = datenum([min(vector), max(vector)]); 
xlim(p1, lims); xlim(p2, lims); 
% Make the plots meet in the middle 
h = 0.45; w = 0.9; % height and width 
set(p1, 'position', [(1-w)/2, 0.5, w, h]) 
set(p2, 'position', [(1-w)/2, 0.5-h, w, h]) 
% Ensure the y axes meet at 0 
ylim(p1, [0, max(x)]); ylim(p2, [min(x), 0]); 

Les deux parcelles peuvent être faites comme bon vous semble. Donc, si vous les avez tracées avec les méthodes appropriées, vous en obtiendrez une avec un axe y exponentiel et une avec un axe y en ordonnée.

Au lieu des plot(...) lignes ci-dessus, vous pouvez utiliser

% log y plot 
semilogy(datenum(vector(idx)), x(idx)) 

Notez que la sortie de ce fonctionne exactement comme prévu, mais l'intrigue réelle que vous essayez de faire des sons très confus. Il serait probablement préférable dans la plupart des situations de présenter ceci comme deux parcelles distinctes si les axes veulent vraiment être différents. Dans ce cas, utilisez le code ci-dessus sans les lignes position!


Avant de déconner avec les types de terrain, c'est ce que la sortie ressemble, les axes y-dessus et au-dessous de la ligne 0 sont complètement indépendants, puisque c'est en fait 2 parcelles:

plot

+1

Merci! Cela fonctionne bien mais je suppose que je suis d'accord que cela semble confus;) Donc, je vais aller avec 2 parcelles à la place, une avec échelle normale, une avec échelle de notation. Maintenant je sais comment faire la semilogie avec les dates, mon seul problème: "les valeurs négatives ne sont pas affichées". Que suggérez-vous? – LenaH

1

Lorsque vous intrigue (x), ce que vous exactement complotez est:

plot(1:length(x),x) 

permet donc dire que vous avez un autre vecteur:

t= 1:length(x) 

vous pouvez maintenant manipuler ce vecteur pour obtenir une mise à l'échelle sur votre axe horizontal par exemple:

t(1:10) = exp(-t(1:10)); 

puis si vous tracez (t, x), vous aurez 1 0 éléments tracés sur une échelle exponentielle!

+0

C'est malheureusement plus compliqué car mon vecteur est daté ... J'ai édité la question ci-dessus pour la rendre plus précise. – LenaH