Как построить 3D-график в MATLAB?
Вопрос
У меня есть три параметра: x
, y
и t
. Но проблема в моей файловой структуре.
Мои файлы названы как
e_x_y.txt
t_x_y.txt
где e_x_y.txt
имеет ошибку для определенных значений x
и y
и t_x_y.txt
соответствующие значения времени.
Мне нужно отобразить значения в e_x_y.txt
на графике x vs y vs t
.
Каков наилучший способ сделать это?
Я знаю, что такое значения x и y, поэтому мне не нужно вычитать их из имен файлов.
<Ч>Чтобы сделать вещи более понятными,
предположим, мои файлы:
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
Я хочу построить следующие точки:
(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
Решение
Тип сюжета, который вы пытаетесь создать, может быть трудно хорошо визуализировать. Я могу дать вам два предложения: одно - то, что вы хотите , и одно - то, что вы, вероятно, должны делать вместо этого ...
Построение 4-D данных:
Для этого вам нужно будет построить серию точек x, y, t
и как-то представить значение ошибки e
в каждой точке. Вы можете сделать это, изменив цвет или размер точки. В этом примере я построю сферу в каждой точке с диаметром, который изменяется в зависимости от ошибки (диаметр 1 соответствует максимальной ожидаемой ошибке). Цвет представляет время. Я буду использовать пример данных, которые вы добавили в вопрос (отформатированный в виде матрицы 5 на 4 со столбцами, содержащими x
, y
, t
и e
data):
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');
А вот как это будет выглядеть:
Проблема: Хотя сюжет выглядит довольно интересным, он не очень интуитивно понятен. Кроме того, построение множества точек таким образом будет загромождено, и будет трудно увидеть их все хорошо.
Более интуитивно понятный трехмерный сюжет:
Может быть лучше вместо этого сделать трехмерный график данных, поскольку его легче интерпретировать. Здесь ось X представляет номер итерации, а ось Y представляет каждую отдельную сеть:
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)
Это дает намного более четкий сюжет:
Другие советы
Хотя я не уверен, что это лучший способ визуализации данных, вот простой способ сделать это, как вы просили. Вы можете нанести трехмерные точки на простой точечный график и отобразить размер ИЛИ цвет на значения четвертого измерения error
. Что-то вроде:
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')