Frage

Ich habe drei Parameter x, y und t. Aber das Problem ist meine Dateistruktur.

Meine Dateien heißen wie:

e_x_y.txt
t_x_y.txt

Dabei gilt e_x_y.txt den Fehler für bestimmte Werte von x hat und y und t_x_y.txt entsprechenden Zeitwerte hat.

Ich brauche die Werte in e_x_y.txt auf einem x vs y vs t Diagramm zu zeichnen.

Was ist der beste Weg, das zu tun?

Ich weiß, was x und y Werte sind, so habe ich sie nicht aus den Dateinamen abzuziehen.


Um die Dinge klarer,

nehme meine Dateien sind:

e_4_5.txt
45
54
t_4_5.txt
2.0
6.0

e_7_8.txt
32
98
121
t_7_8.txt
2
9
1.0

Ich möchte die folgenden Punkte zeichnen:

(4,5,2.0) = 45
(4,5,6.0) = 54
(7,8,2.0) = 32 
(7,8,9.0) = 98
(7,8,1.0) = 121
War es hilfreich?

Lösung

Die Art der Handlung versuchen Sie gut sichtbar zu machen kann schwierig sein, zu machen. Ich kann Ihnen zwei Vorschläge geben: Die eine ist, was Sie wollen , und man ist, was Sie sollten wahrscheinlich tun, anstatt ...

Plotten 4-D-Daten:

Um dies zu tun, werden Sie eine Reihe von x,y,t Punkten plotten müssen und irgendwie den Fehlerwert e an jedem Punkt darstellen. Sie können dies tun, indem Sie die Farbe oder die Größe des Punktes ändern. In diesem Beispiel werde ich eine Kugel an jedem Punkt mit einem Durchmesser des Grundstück, die auf dem Fehler (ein Durchmesser von 1 entspricht die maximal zu erwartenden Fehlern) basierend variieren. Die Farbe steht für die Zeit. Ich werde die Beispieldaten verwenden Sie die Frage hinzugefügt (formatiert als 5-by-4 Matrix mit den Spalten mit den x, y, t und e Daten):

data = [4 5 2 45; 4 5 6 54; 7 8 2 32; 7 8 9 98; 7 8 1 121];
[x, y, z] = sphere;  % Coordinate data for sphere
MAX_ERROR = 121;     % Maximum expected error
for i = 1:size(data, 1)
  c = 0.5*data(i, 4)/MAX_ERROR;  % Scale factor for sphere
  X = x.*c+data(i, 1);           % New X coordinates for sphere
  Y = y.*c+data(i, 2);           % New Y coordinates for sphere
  Z = z.*c+data(i, 3);           % New Z coordinates for sphere
  surface(X, Y, Z, 'EdgeColor', 'none');  % Plot sphere
  hold on
end
grid on
axis equal
view(-27, 16);
xlabel('x');
ylabel('y');
zlabel('t');

Und hier ist, wie es aussehen würde:

Das Problem: Auch wenn die Handlung irgendwie interessant aussieht, es ist nicht sehr intuitiv. Auch viele Punkte auf diese Weise Plotten erhalten unübersichtlich und es wird schwer sein, sie alle gut zu sehen.

Mehr intuitiver 3D-Plot:

Es kann besser sein, stattdessen eine 3-D-Darstellung der Daten zu machen, da es einfacher sein kann, zu interpretieren. Hier stellt die x-Achse die Iterationszahl und die y-Achse stellt jedes einzelne Netzwerk:

plot3(1:2, [1 1], [2 45; 6 54]);           % Plot data for network 4-5
hold on
plot3(1:3, [2 2 2], [2 32; 9 98; 1 121]);  % Plot data for network 7-8
xlabel('iteration number');
set(gca, 'YTick', [1 2], 'YTickLabel', {'network 4-5', 'network 7-8'})
grid on
legend('time', 'error')
view(-18, 30)

Dies erzeugt eine viel klarere Handlung:

Andere Tipps

Auch wenn ich das nicht die beste Art und Weise überzeugt bin, um die Daten zu visualisieren, hier ist eine einfache Möglichkeit, es zu tun, wie Sie gefragt. Sie können die 3D-Punkte in einem einfachen Streudiagramm zeichnen, und ordnen die Größe oder die Farbe auf die Werte der vierten Dimension error. So etwas wie:

x = randi(20, [10 1]);
y = randi(20, [10 1]);
t = randi(10, [10 1]);
e = randi(200, [10 1]);

% map `e` to color
figure(1)
scatter3(x, y, t, 200, e, 'filled')
xlabel('x'), ylabel('y'), zlabel('t')
colormap(hot), colorbar

% map `e` to size
figure(2)
scatter3(x, y, t, e, 'filled')
xlabel('x'), ylabel('y'), zlabel('t')

color Größe

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top