Pergunta

Eu tenho três parâmetros x, y e t. Mas o problema é a minha estrutura de arquivo.

Meus arquivos são nomeados como:

e_x_y.txt
t_x_y.txt

onde e_x_y.txt tem o erro para valores particulares de x e y e t_x_y.txt tem valores de tempo correspondente.

Eu preciso traçar os valores em e_x_y.txt em um gráfico x vs y vs t.

Qual é a melhor maneira de fazer isso?

Eu sei o que os valores xey são, então eu não tenho que deduzir-los dos nomes de arquivo.


Para tornar as coisas mais claras,

que meus arquivos são:

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

Eu quero traçar os seguintes pontos:

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

Solução

O tipo de gráfico que você está tentando fazer pode ser difícil de visualizar bem. Posso dar-lhe duas sugestões: um é o que você deseja , e um é o que você provavelmente deve fazer em vez disso ...

Traço de dados 4-D:

A fim de fazer isso, você terá de traçar uma série de pontos x,y,t e de alguma forma representam o valor de erro e em cada ponto. Você pode fazer isso mudando a cor ou o tamanho do ponto. Neste exemplo, vou traçar uma esfera em cada ponto com um diâmetro que varia de acordo com o erro (um diâmetro de 1 equivale ao erro máximo esperado). A cor representa o tempo. Eu vou ser usando os dados de amostra tenha adicionado à pergunta (formatado como um 5-por-4 matriz com as colunas que contêm o x, y, t, e dados 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');

E aqui está o que ele ficaria assim:

enter descrição da imagem aqui

O problema: Embora a aparência da trama tipo de interessante, não é muito intuitivo. Além disso, traçando muitos pontos desta forma vai ficar confuso e vai ser difícil vê-los todos bem.

Mais intuitiva lote 3-D:

Pode ser melhor, em vez fazer uma trama 3-D dos dados, uma vez que pode ser mais fácil de interpretar. Aqui, o eixo x representa o número da iteração eo eixo Y representa cada rede 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)

Isso produz uma trama muito mais clara:

enter descrição da imagem aqui

Outras dicas

Mesmo que eu não estou convencido de que esta a melhor maneira de visualizar os dados, aqui está uma maneira simples de fazê-lo como você pediu. Você pode plotar os 3D pontos em um gráfico de dispersão simples, e mapear o tamanho ou a cor para os valores da quarta error dimensão. 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 tamanho

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top