Pregunta

Tengo tres parámetros x , y y t . Pero el problema es mi estructura de archivos.

Mis archivos se nombran como:

e_x_y.txt
t_x_y.txt

donde e_x_y.txt tiene el error para valores particulares de x y y y t_x_y.txt tiene valores de tiempo correspondientes.

Necesito trazar los valores en e_x_y.txt en un gráfico de x vs y vs t .

¿Cuál es la mejor manera de hacerlo?

Sé lo que son los valores x e y, por lo que no tengo que deducirlos de los nombres de los archivos.


Para aclarar las cosas,

Supongamos que mis archivos son:

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

Quiero trazar los siguientes puntos:

(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
¿Fue útil?

Solución

El tipo de trama que estás tratando de hacer puede ser difícil de visualizar bien. Puedo darte dos sugerencias: una es lo que quieres y otra es lo que probablemente deberías hacer en su lugar ...

Graficando datos 4-D:

Para hacer esto, tendrá que trazar una serie de puntos x, y, t y de alguna manera representar el valor de error e en cada punto. Puede hacer esto cambiando el color o el tamaño del punto. En este ejemplo, graficaré una esfera en cada punto con un diámetro que varía según el error (un diámetro de 1 equivale al error máximo esperado). El color representa el tiempo. Usaré los datos de muestra que agregó a la pregunta (formateada como una matriz 5 por 4 con las columnas que contienen el x , y , t y e datos):

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

Y así es como se vería:

 introduce la descripción de la imagen aquí

El problema: Aunque la trama parece bastante interesante, no es muy intuitiva. Además, trazar muchos puntos de esta manera se desordenará y será difícil verlos todos bien.

Gráfico 3D más intuitivo:

Puede ser mejor hacer una gráfica tridimensional de los datos, ya que puede ser más fácil de interpretar. Aquí, el eje x representa el número de iteración y el eje y representa cada red individual:

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)

Esto produce una trama mucho más clara:

 introduce la descripción de la imagen aquí

Otros consejos

Aunque no estoy convencido de que esta sea la mejor forma de visualizar los datos, aquí hay una forma sencilla de hacerlo cuando se lo solicite. Puede trazar los puntos 3D en un diagrama de dispersión simple y asignar el tamaño O el color a los valores de la cuarta dimensión error . Algo como:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top