2017-10-25 6 views
3

Welche Befehle brauche ich, um die x-Achsenwerte in einer offenen Matlab-Figur zu verschieben, ohne die y-Achsenwerte zu beeinflussen?Wie ersetzt man die x-Achse in einer Matlab-Figur?

Meine beste Vermutung bisher (wie in den Bildern unten dargestellt):

LineH = get(gca, 'Children'); 
x = get(LineH, 'XData'); 
y = get(LineH, 'YData'); 

offset=20; 

nx = numel(x); 
for i=1:nx 
    x_shifted{i} = x{i} + offset; 
end 

set(LineH,'XData',x_shifted') 

Was mir den Fehler gibt:

Error using matlab.graphics.chart.primitive.Line/set 
While setting the 'XData' property of Line: 
Value must be a vector of numeric type 

Dank!

non_shifted_axis shifted_axis

Antwort

3

Sie haben die 'XData' property Namen in einer Zelle verkapseln mehr Plot-Objekte zu einem Zeitpunkt, zu aktualisieren. Von der set Dokumentation:

set(H,NameArray,ValueArray) specifies multiple property values using the cell arrays NameArray and ValueArray . To set n property values on each of m graphics objects, specify ValueArray as an m -by- n cell array, where m = length(H) and n is equal to the number of property names contained in NameArray .

So Ihre Fehler zu beheben, müssen Sie nur die letzte Zeile dieses ändern müssen:

set(LineH, {'XData'}, x_shifted'); 

Und wenn Sie daran interessiert sind, hier ist eine Lösung, die cellfun verwendet stattdessen einer Schleife:

hLines = get(gca, 'Children'); 
xData = get(hLines, 'XData'); 
offset = 20; 

set(hLines, {'XData'}, cellfun(@(c) {c+offset}, xData)); 
3

Anscheinend setzen Sie können nicht die 'XData' Eigenschaft aller Linien in der gleichen Zeit mit einem Zellenfeld.

EDIT Es kann getan werden; siehe @gnovice's answer.

Was Sie tun können, ist nur die set Anweisung in die Schleife bewegen:

LineH = get(gca, 'Children'); 
x = get(LineH, 'XData'); 
y = get(LineH, 'YData'); 

offset=20; 

nx = numel(x); 
for i=1:nx 
    x_shifted{i} = x{i} + offset; 
    set(LineH(i),'XData',x_shifted{i}); % set statement with index i 
end 
Verwandte Themen