使用 pfg 图在三维中绘制单位单纯形

使用 pfg 图在三维中绘制单位单纯形

我正在尝试绘制一些类似这样的内容: 在此处输入图片描述

我正在使用以下代码:

\begin{tikzpicture}
\begin{axis}[
grid=major]
\addplot3[
    surf,
] 
coordinates {
(1,0,0) 

(0,1,0) 

(0,0,1)
};
\end{axis}
\end{tikzpicture}

但没有得到预期的结果,有什么提示可以解决此问题吗?

答案1

编辑版本:插入轴刻度

刻度标签的定位有点“脆弱”:根据您在宏中设置的值,您可能会得到丑陋的结果\tdplotsetmaincoords。此外,代码变得越来越复杂,因此对于更复杂的图形,最好使用pgfplots

\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{70}{130}
\begin{tikzpicture}[tdplot_main_coords]
  \def\laxis{5}
  \def\ltriangle{3}
  \def\ltick{.2}
  %%% axes
  \draw [->] (0,0,0) -- (\laxis,0,0) node [below] {$x$};
  \draw [->] (0,0,0) -- (0,\laxis,0) node [right] {$y$};
  \draw [->] (0,0,0) -- (0,0,\laxis) node [left] {$z$};
  %%% axes ticks
  \pgfmathtruncatemacro{\nticks}{floor(\laxis)-1}
  \begin{scope}[
    help lines,
    every node/.style={inner sep=1pt,text=black}
    ]
    \foreach \coord in {1,...,\nticks} {
      \draw (\coord,\ltick,0) -- ++(0,-\ltick,0) -- ++(0,0,\ltick)
      node [pos=1,left] {\coord};
      \draw (\ltick,\coord,0) -- ++(-\ltick,0,0) -- ++(0,0,\ltick)
      node [pos=1,right] {\coord};
      \draw (\ltick,0,\coord) -- ++(-\ltick,0,0) -- ++(0,\ltick,0)
      node [at start,above right] {\coord};
    }
  \end{scope}
  %%% figure
  \filldraw [opacity=.33,red] (\ltriangle,0,0) -- (0,\ltriangle,0)
  -- (0,0,\ltriangle) -- cycle;
\end{tikzpicture}
\end{document}

在此处输入图片描述

第一个版本

如果您只是想要一些与您发布的内容类似的东西,您可以使用该tikz-3dplot包。

\tdplotsetmaincoords{<angle1>}{<angle2>}可以让您选择图形的“视点”(稍微思考一下角度值以获得所需的结果。)

\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{70}{130}
\begin{tikzpicture}[tdplot_main_coords]
  \def\laxis{5}
  \def\ltriangle{3}
  \begin{scope}[->,red]
    \draw (0,0,0) -- (\laxis,0,0) node [below] {\textcolor{blue}{$x$}};
    \draw (0,0,0) -- (0,\laxis,0) node [right] {\textcolor{blue}{$y$}};
    \draw (0,0,0) -- (0,0,\laxis) node [left] {\textcolor{blue}{$z$}};
  \end{scope}
  \filldraw [opacity=.5,green] (\ltriangle,0,0) -- (0,\ltriangle,0) --
  (0,0,\ltriangle) -- cycle;
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

您几乎已经掌握了:使用patch而不是surf。两者相同,但输入格式不同:patch接受单个面片段(默认为三角形),而surf输入时需要矩阵。

\documentclass{standalone}

\usepackage{pgfplots}

\pgfplotsset{compat=1.12}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
grid=major]
\addplot3[
    patch,
] 
coordinates {
(1,0,0) 
(0,1,0) 
(0,0,1)
};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

或者,用所有面孔:

\documentclass{standalone}

\usepackage{pgfplots}

\pgfplotsset{compat=1.12}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
grid=major]
\addplot3[
    patch,
] 
coordinates {
% diagonal:
(1,0,0) 
(0,1,0) 
(0,0,1)

% bottom:
(0,0,0) 
(0,1,0) 
(1,0,0)

% side 1
(0,0,0) 
(0,0,1) 
(1,0,0)

% side 2
(0,0,0) 
(0,0,1) 
(0,1,0)
};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

颜色根据 Z 坐标确定,请参阅手册以了解如何采用颜色。

答案3

这可能对我们中的一些人来说有用,所以这是另一种在三维中绘制单纯形的方法,

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}

\begin{tikzpicture}
\begin{axis}[width=0.75*\textwidth,
                axis lines=middle,
                axis equal,
                xlabel=$x$,
                ylabel=$y$,
                zlabel=$z$,
                xmin=0,
                xmax=1.25,
                ymin=0,
                ymax=1.25,
                zmin=0,
                zmax=1.25,
                xtick={0,1},
                ytick={0,1},
                ztick={0,1},
                view={135}{30}]
\addplot3[patch, color=blue!25, fill opacity=0.25, faceted color=black, line width=0.5pt] coordinates{(1,0,0) (0,1,0) (0,0,1)};
\end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

这个想法是为了能够调整外线颜色以及填充颜色和不透明度,以便看到轴穿过单纯形。

罗曼

相关内容