Domanda

Ho tre parametri x , y e t . Ma il problema è la mia struttura di file.

I miei file sono chiamati come:

e_x_y.txt
t_x_y.txt

dove e_x_y.txt presenta l'errore per valori particolari di x e y e t_x_y.txt valori temporali corrispondenti.

Devo tracciare i valori in e_x_y.txt su un grafico x vs y vs t .

Qual è il modo migliore per farlo?

So quali sono i valori xey, quindi non devo detrarli dai nomi dei file.


Per rendere le cose più chiare,

supponiamo che i miei file siano:

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

Voglio tracciare i seguenti punti:

(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
È stato utile?

Soluzione

Il tipo di trama che stai cercando di creare potrebbe essere difficile da visualizzare bene. Posso darti due suggerimenti: uno è quello che vuoi , e uno è quello che dovresti probabilmente fare invece ...

Stampa dati 4-D:

Per fare ciò, dovrai tracciare una serie di punti x, y, t e in qualche modo rappresentare il valore di errore e in ciascun punto. È possibile farlo modificando il colore o la dimensione del punto. In questo esempio, tracciamo una sfera in ciascun punto con un diametro che varia in base all'errore (un diametro di 1 equivale all'errore massimo previsto). Il colore rappresenta l'ora. Userò i dati di esempio che hai aggiunto alla domanda (formattati come una matrice 5 per 4 con le colonne contenenti x , y , t e e ):

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

Ed ecco come sarebbe:

 inserisci qui la descrizione dell'immagine

Il problema: sebbene la trama appaia piuttosto interessante, non è molto intuitiva. Inoltre, tracciando molti punti in questo modo si ingombra e sarà difficile vederli tutti bene.

Trama 3D più intuitiva:

Potrebbe essere preferibile invece creare un grafico 3D dei dati, poiché potrebbe essere più semplice da interpretare. Qui, l'asse x rappresenta il numero di iterazione e l'asse y rappresenta ogni singola rete:

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)

Questo produce una trama molto più chiara:

 inserisci qui la descrizione dell'immagine

Altri suggerimenti

Anche se non sono convinto che sia il modo migliore per visualizzare i dati, ecco un modo semplice per farlo come richiesto. È possibile tracciare i punti 3D in un semplice diagramma a dispersione e mappare la dimensione O il colore ai valori della errore . Qualcosa del tipo:

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 size

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top