Надеюсь, я смогу описать свой вопрос более ясно здесь, в содержании, чем в заголовке. Он может быть больше о стратегии визуализации, чем о конкретных методах pgfplots. Проблема в регрессиях двумерного ввода, но, пожалуйста, позвольте мне начать с одномерного ввода.
Допустим, в моем эксперименте я изменяю вход x и наблюдаю выход y. Я повторяю эксперименты три раза. График показывает результаты (код указан в конце):
Теперь предположим, что мой эксперимент имеет два входа x и y и выход z. Для наблюдений из одного эксперимента это можно изобразить следующим образом:
Однако для повторных экспериментов (скажем, 4-5 раз) трехмерный график, содержащий все эти результаты, довольно запутан. График среднего и отклонения выглядит лучше, но определенно теряет информацию. Вот пример, когда эксперименты повторяются дважды (два набора наблюдений), графики будут такими:
Есть ли какая-либо стратегия, которая может визуализировать этот случай (множественные xyz) лучше? «Лучше» может быть в том смысле, что каждый отдельный эксперимент представлен четко, а также несколько экспериментов представлены вместе для удобства сравнения.
Для справки, вот код pgfplots, генерирующий графики.
График множественных xyz:
\begin{tikzpicture}[scale=0.8]
\begin{axis}
[scale only axis, width=0.35\textwidth,
xlabel=x, ylabel=y, zlabel=z, title=Two dimensional input,]
\addplot3[surf,mesh/rows=5] coordinates {
(0,0,0) (1,0,0) (2,0,0) (3,0,0)
(0,1,0.1) (1,1,0.3) (2,1,0.3) (3,1,0.4)
(0,2,0.15) (1,2,0.5) (2,2,0.5) (3,2,0.5)
(0,3,0.65) (1,3,0.60) (2,3,0.65) (3,3,0.45)
(0,4,0.8) (1,4,0.75) (2,4,0.85) (3,4,0.65)
};
\addplot3[surf,mesh/rows=5] coordinates {
(0,0,0.1) (1,0,0.1) (2,0,0) (3,0,0)
(0,1,0.3) (1,1,0.2) (2,1,0.2) (3,1,0.4)
(0,2,0.15) (1,2,0.6) (2,2,0.5) (3,2,0.5)
(0,3,0.55) (1,3,0.7) (2,3,0.65) (3,3,0.45)
(0,4,0.6) (1,4,0.85) (2,4,0.65) (3,4,0.35)
};
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}[scale=0.8]
\begin{axis}[scale only axis, width=0.3\textwidth,
xlabel=x, ylabel=y, zlabel=z, title=Mean and Deviation,]
\addplot3[surf,mesh/rows=5,
error bars/z dir=both, error bars/z fixed=0.1,] coordinates {
(0,0,0.05) (1,0,0.05) (2,0,0) (3,0,0)
(0,1,0.2) (1,1,0.25) (2,1,0.25) (3,1,0.4)
(0,2,0.15) (1,2,0.55) (2,2,0.5) (3,2,0.5)
(0,3,0.65) (1,3,0.65) (2,3,0.65) (3,3,0.45)
(0,4,0.7) (1,4,0.80) (2,4,0.75) (3,4,0.5)
};
\end{axis}
\end{tikzpicture}
Одиночный график xyz:
\begin{tikzpicture}[scale=0.8]
\begin{axis}
[scale only axis, width=0.35\textwidth,
xlabel=x, ylabel=y, zlabel=z, title=Two dimensional input,]
\addplot3[surf,mesh/rows=5] coordinates {
(0,0,0) (1,0,0) (2,0,0) (3,0,0)
(0,1,0.1) (1,1,0.3) (2,1,0.3) (3,1,0.4)
(0,2,0.15) (1,2,0.5) (2,2,0.5) (3,2,0.5)
(0,3,0.65) (1,3,0.60) (2,3,0.65) (3,3,0.45)
(0,4,0.8) (1,4,0.75) (2,4,0.85) (3,4,0.65)
};
\end{axis}
\end{tikzpicture}
\hfill
\begin{tikzpicture}[scale=0.8]
\begin{axis}[view={0}{90}, scale only axis, width=0.3\textwidth,
xlabel=x, ylabel=y, zlabel=z, title=Top view of two dimensional input, ]
\addplot3[surf,mesh/rows=5] coordinates {
(0,0,0) (1,0,0) (2,0,0) (3,0,0)
(0,1,0.1) (1,1,0.3) (2,1,0.3) (3,1,0.4)
(0,2,0.15) (1,2,0.5) (2,2,0.5) (3,2,0.5)
(0,3,0.65) (1,3,0.60) (2,3,0.65) (3,3,0.45)
(0,4,0.8) (1,4,0.75) (2,4,0.85) (3,4,0.65)
};
\end{axis}
\end{tikzpicture}
График множественных xy:
\begin{tikzpicture}
\begin{axis}
[scale only axis, width=0.3\textwidth,
xlabel=x, ylabel=y, title=One dimensional input]
\addplot coordinates{(0, 0.6) (0.1, 0.25) (0.2, 0.1) (0.3, 0.06) (0.4, 0.02) (0.5, 0.01)};
\addplot coordinates{(0, 0.7) (0.1, 0.1) (0.2, 0.125) (0.3, 0.08) (0.4, 0.016) (0.5, 0.02)};
\addplot coordinates{(0, 0.5) (0.1, 0.15) (0.2, 0.15) (0.3, 0.10) (0.4, 0.012) (0.5, 0.03)};
\legend{exp1, exp2, exp3}
\end{axis}
\end{tikzpicture}
\hfill
\begin{tikzpicture}
\begin{axis}
[scale only axis, width=0.3\textwidth,
xlabel=x, ylabel=y, title=Mean and Deviation]
\addplot[ error bars/.cd, y dir=both, y explicit, ]
coordinates{(0, 0.6) +- (0, 0.1)
(0.1, 0.1) +- (0, 0.1)
(0.2, 0.125) +- (0, 0.025)
(0.3, 0.08) +- (0, 0.08)
(0.4, 0.016) +- (0, 0.04)
(0.5, 0.02) +- (0, 0.02)};
\end{axis}
\end{tikzpicture}
Однако,
решение1
Чтобы получить эту картинку...
...попробуйте эти команды,
pdflatex example.tex; asy -twosided *.asy; pdflatex example.tex
...чтобы скомпилировать этот пример.
\documentclass[]{article}
\usepackage[]{asymptote}
\begin{document}
Two Dimensional Input
\vspace{3cm}
\begin{asy}
settings.render=4;
import three;
import graph3;
currentlight=White;
currentprojection=orthographic(3,-5,1,center=true);
size(5cm);
size3(5cm,5cm,5cm, IgnoreAspect);
render render=render(compression=Low,merge=true);
triple[][] t1 =
{
{(0,0,0), (1,0,0), (2,0,0), (3,0,0) },
{(0,1,0.1), (1,1,0.3), (2,1,0.3), (3,1,0.4)},
{(0,2,0.15), (1,2,0.5), (2,2,0.5), (3,2,0.5)},
{(0,3,0.65), (1,3,0.60), (2,3,0.65), (3,3,0.45)},
{(0,4,0.8), (1,4,0.75), (2,4,0.85), (3,4,0.65)}
};
triple[][] t2 =
{
{(0,0,0.1), (1,0,0.1), (2,0,0), (3,0,0)},
{(0,1,0.3), (1,1,0.2), (2,1,0.2), (3,1,0.4)},
{(0,2,0.15), (1,2,0.6), (2,2,0.5), (3,2,0.5)},
{(0,3,0.55), (1,3,0.7), (2,3,0.65), (3,3,0.45)},
{(0,4,0.6),(1,4,0.85),(2,4,0.65),(3,4,0.35)}
};
draw(surface(t1), blue+opacity(0.9));
draw(surface(t2), red+opacity(0.6));
xaxis3("$x$",Bounds,InTicks);
yaxis3("$y$",Bounds,InTicks);
zaxis3("$z$",Bounds,InTicks);
\end{asy}
\end{document}
Очевидно, вам необходимо иметь pdflatex, пакет asymptote и asymptote, установленные в вашей системе. При некоторой удаче вы также получите интерактивный 3D-объект в вашем PDF, если откроете его в последней версии Acrobat Reader.
Само собой разумеется, я согласен с Джейком, что даже если бы вы могли сделать это с помощью pgfplots (чего вы просто не можете), это было бы очень запутанно.
решение2
Другое похожее решение, но использующее чисто pgfplots
(не asymptote
), — это добавить opacity=0.5
опцию к поверхностям. Как это:
\addplot3[surf,mesh/rows=5, opacity=0.5] coordinates { ...
Это все еще не идеально, но, по крайней мере, изображение является физическим (призрачные поверхности проникают друг в друга) и не травмирует мозг, создавая невозможный трехмерный объект. Обратите внимание, что трюк работает только для значения 0,5 (т. е. не одна поверхность больше покрывает другую), в противном случае поверхности начинают перекрываться таким образом, что мозг находит это странным.
Вы даже можете проделать тот же трюк с планками погрешностей (с opacity
), чтобы получить следующий эффект:
Ниже приведен полный код для последнего рисунка:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}[scale=0.8]
\begin{axis}
[scale only axis, width=0.35\textwidth,
xlabel=x, ylabel=y, zlabel=z, title=Two dimensional input,]
\addplot3[surf,mesh/rows=5,opacity=0.5] coordinates {
(0,0,0) (1,0,0) (2,0,0) (3,0,0)
(0,1,0.1) (1,1,0.3) (2,1,0.3) (3,1,0.4)
(0,2,0.15) (1,2,0.5) (2,2,0.5) (3,2,0.5)
(0,3,0.65) (1,3,0.60) (2,3,0.65) (3,3,0.45)
(0,4,0.8) (1,4,0.75) (2,4,0.85) (3,4,0.65)
};
\addplot3[surf,mesh/rows=5, opacity=0.5] coordinates {
(0,0,0.1) (1,0,0.1) (2,0,0) (3,0,0)
(0,1,0.3) (1,1,0.2) (2,1,0.2) (3,1,0.4)
(0,2,0.15) (1,2,0.6) (2,2,0.5) (3,2,0.5)
(0,3,0.55) (1,3,0.7) (2,3,0.65) (3,3,0.45)
(0,4,0.6) (1,4,0.85) (2,4,0.65) (3,4,0.35)
};
\addplot3[mesh/rows=5,
error bars/z dir=both, error bars/z fixed=0.1, opacity=0.3, draw=none] coordinates {
(0,0,0.05) (1,0,0.05) (2,0,0) (3,0,0)
(0,1,0.2) (1,1,0.25) (2,1,0.25) (3,1,0.4)
(0,2,0.15) (1,2,0.55) (2,2,0.5) (3,2,0.5)
(0,3,0.65) (1,3,0.65) (2,3,0.65) (3,3,0.45)
(0,4,0.7) (1,4,0.80) (2,4,0.75) (3,4,0.5)
};
\end{axis}
\end{tikzpicture}
\end{document}