2016-05-08 21 views
4

Ich habe einige Daten, die ich als Konturdiagramm mit logarithmischer Skala der Werte anzeigen möchte (die Matrix Z) und beschriftete countours. Dies ist, wie ich es tun:Matlab: wie logarithmische Skala auf der Coutour-Plot

[C, h1] = contourf(X, Y, log(Z)); 
clabel(C,h1); 

Hier ist mein Ergebnis:

image

Meine Frage ist: Wie kann ich die richtigen Etiketten auf den Konturen bekommen? Ich möchte keinen Farbbalken wie beschrieben here.

Edit: Hier ist mein Beispiel:

X = 1:1:20; 
Y = X; 
Z = zeros(size(Y)); 
for i = 1:size(Y,2); 
    Z(i, :) = 10^i; 
end 

[C, h1] = contourf(X, Y, Z); 
clabel(C,h1); 

Meine wahren Daten sehen wie folgt aus: true

ich irgendwelche countour Linien Etiketten kann ich will, aber sie werden nicht sichtbar sein da meine Daten exponentiell sind (Und übrigens, die Beschriftungen, die in diesem Diagramm sichtbar sind, sind die wahren, diejenigen, die ich in der nächsten Handlung bekommen möchte).

Jetzt, da meine Daten exponentiell sind, muss ich die logarithmische Skala auf den angezeigten Werten (die Matrix Z) verwenden, um die Daten richtig zu zeigen. Hier ist, wie ich es tun (vielleicht gibt es einen anderen, besseren Weg, ich weiß es nicht, ich habe nichts anderes gefunden):

[C, h1] = contourf(X, Y, log(Z)); 
clabel(C,h1); 

Hier ist, wie mein Bild sieht aus wie: logdtata

Und es sieht jetzt gut aus - Sie können sehen, wie meine Daten variieren. Die Etiketten sind jedoch falsch. Ich kann sie jetzt auf jeden beliebigen Vektor setzen:

  1. 0: 5: 45 - und ich werde genau das bekommen, was ich jetzt habe.
  2. 10^[0: 5: 45] (diese Etiketten hätte ich gerne). Aber jetzt sind meine geplotteten Daten geklingelt (0, 45) (weil ich den Logarithmus davon berechnet habe). Daher werden die meisten Labels nicht angezeigt (sie überschreiten den Datenbereich), und der eine wird falsch platziert.

Idealerweise würde Ich mag so etwas wie dies zu:

[C, h1] = contourf(X, Y, Z, 'ZScale', 'Log'); 
clabel(C,h1); 

und das Bild an der Unterseite erhalten mit Etiketten 10, 10^5, 10^10 usw.

zusammenfassend, ich brauche einen der folgenden Schritte zu tun:

  1. einen Weg finden, die logarithmische Skala programma einstellen Lassen Sie Matlab sich Gedanken über die Isolinien machen.

  2. Sie können die Beschriftung auf den Isolinien manuell ändern, ohne sie zu verschieben (new_label = 10^old_label).

+0

ich weiß, Sie Seite Etiketten mit 'ytick' – Yvon

+0

@Yvon hinzufügen können, wie würde das mir helfen? Ich möchte keine zusätzlichen Etiketten - ich möchte nur die Etiketten ändern, die ich in den Konturen habe. Und gemäß der Dokumentation gibt es keine ytick-Eigenschaft für Konturplot (http://www.mathworks.com/help/matlab/ref/contour-properties.html) – user2738748

+0

Welche Etiketten sprechen Sie? Die von "clabel" gezogenen? – BillBokeey

Antwort

2

ein wenig ‚Hack‘, das funktioniert, obwohl es nicht möglich sein wird, die Etiketten so schön zu halten, wie sie mit einem Aufruf an clabel(C,h1) sind:

Der erste Schritt besteht die bei der Berechnung Werte der Konturlinien. Sie sagen, Sie wollen, dass sie bei 1,10,... und so weiter platziert werden, so dass Sie müssen nur die erste Potenz von 10 größer als das Maximum Ihrer Daten zu finden:

nextpow10Z=ceil(log10(max(Z(:)))); 

Jetzt contourf mit dem Vektor der Konturlinie Wert nennen:

[C,h1]=contourf(X,Y,log10(Z),1:nextpow10Z); 

anstatt nun clabel(C,h1); aufzurufen, müssen wir eine andere Syntax von clabel verwenden, die es uns ermöglichen, wird eine Schleife, die Texte Trog (Die Herabstufung ist, dass sie weniger hübsch sein werden):

tl=clabel(C); 

enter image description here

Nun, wenn Sie die Beschreibung von tl gehen sehen, werden Sie sehen, dass es ein Data Objekt, mit Text und Line Elemente.

Der nächste Schritt besteht darin, alle Elemente vom Typ Text enthalten ist bei der Auswahl von tl:

TextElements=findobj(tl,'Type','Text'); 

Schließlich ist der letzte Schritt in einer Schleife über diese sein wird und ersetzt die Zahlen N mit 1EN:

for i=1:length(TextElements) 
    TextElements(i).String=strcat('1E',TextElements(i).String); 
end 

Und voila!

enter image description here

+0

Bitte, schaue dir meine Bearbeitung an. Ihre Skala im zweiten Diagramm ist nicht logarithmisch. Logarithmisch bedeutet, dass (zum Beispiel) folgende Isolinien dargestellt werden: * 1, 10, 100, 1000 *. Außerdem möchte ich die Position der Isolinien nicht ändern, ich möchte entweder die logarithmische Skala auf meine Werte setzen oder die Isolinien in meiner Darstellung betrügen und rotzeichnen können. – user2738748