现在我的 3D 曲线已经按照我想要的方式表现了,我想添加文本节点和矢量箭头等等。下面是我的基本图表的 MWE 和我添加的第一个带标签的箭头。对于这么小的添加,这需要做大量的工作。有没有关于如何更好地处理这个问题的建议,或者我只能反复试验?
杰克的建议很好,我的图表正在制作中。应用这个时,我不得不使用一个技巧 - 白色图 - 来腾出空间,这样我的箭头和标签就不会被剪掉。有什么意见吗?
另外,如果我想将紫色向量三元组的全部或部分沿红色曲线移动大约 1 个坐标单位,同时保持其原始方向或改变它们,该怎么办?改变它们的一个原因可能是让其中两个保持切线,另一个保持与这些曲线所在表面的法线。当然,我必须做一些自己的计算,但什么是最佳坐标来表达这些计算的结果并适当地定位向量?我想要的不多,不是吗?
平均能量损失
\documentclass{standalone}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{pgfplots}
\usepackage{mathtools}
\pgfplotsset{compat=1.9}
\begin{document}
\par\begin{tikzpicture}
\begin{axis}[
scale=2,
x={(-0.6cm,-0.3cm)}, y={(.6cm,0.0cm)}, z={(0cm,.6cm)},
xlabel={$x$}, ylabel={$y$}, zlabel={$z$},
axis lines=middle, axis on top,
xtick={1}, ytick={2},ztick={1},
enlargelimits=true,
clip=true
]
\addplot3[
color=white,
domain=0:4
]({x/2},{1.3*x},{x/2});
\addplot3[
samples y=0,
smooth, thick, color=blue,
domain=0:sqrt(2)
] ({0},{4-2*x^2},{x});
\draw [-latex,color=violet,thick] (current plot begin) -- +(axis direction cs:0,0,1)
node [anchor=west] {$ds$};
\draw [-latex,color=violet,thick] (current plot begin) -- +(axis direction cs:1,0,0)
node [anchor=north west] {$dt$};
\draw [-latex,color=violet,thick] (current plot begin) -- +(axis direction cs:0,1,0)
node [anchor=north] {$n$};
\addplot3[
samples y=0,
smooth, thick, color=green,
domain=0:2
] ({x},{0},{sqrt(2-x^2/2)});
\addplot3[
samples y=0,
smooth, thick, color=red,
domain=0:2
] ({x},{4-x^2},{0});
\end{axis}
\end{tikzpicture}
\end{document}
答案1
试错绝对不是你所能做的一切,这应该是最后的手段。人们之所以会以编程方式生成这样的图形而不是使用 GUI,是因为你可以定义图形元素之间的逻辑关系。
一般建议:如果你想用 TikZ 元素增强 PGFPlots 图,请将这些 TikZ 命令里面环境axis
。这样,轴坐标系就可用于绘制元素,而您不必捏造坐标。
对于这个具体的图片,思考一下你想要描绘什么会有所帮助:你想要一条从蓝色图的起点开始的线,在 z 方向上的长度为一个 z 单位。要绘制这条线,你可以添加以下线
\draw (current plot begin) -- +(axis direction cs:0,0,1);
紧接着\addplot
蓝色图的命令。节点current plot begin
指的是前一个命令的起点\addplot
。+
路径命令中的表示相对于前一个坐标的坐标,axis direction cs:0,0,1
是 z 轴方向上一个 z 单位的点。
要获取箭头和标签,您可以使用
\draw [-latex] (current plot begin) -- +(axis direction cs:0,0,1) node [anchor=west] {$n$};
使用常规 TikZ 命令绘制的对象不会影响绘图范围,这就是您使用不可见\addplot
命令的原因。更好的方法是使用 明确设置上限ymax=5
,或通过设置 来防止切断对象clip=false
。
要沿着图移动三面体,请在coordinate [pos=0.3] (trihedron origin)
命令末尾添加定义一个新坐标\addplot
,然后使用该坐标绘制三面体(而不是current plot origin
)。
第一个例子的代码:
\documentclass[12pt,a4paper,fleqn]{article}
\usepackage[a5paper,margin=14mm]{geometry}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\begin{document}
\par\begin{tikzpicture}
\begin{axis}[
scale=2,
x={(-0.6cm,-0.3cm)}, y={(.6cm,0.0cm)}, z={(0cm,.6cm)},
xlabel={$x$}, ylabel={$y$}, zlabel={$z$},
axis lines=middle, axis on top,
xtick={1}, ytick={2},ztick={1},
enlargelimits=true
]
\addplot3[
samples y=0,
smooth, thick, color=blue,
domain=0:sqrt(2)
] ({0},{4-2*x^2},{x});
\draw [-latex] (current plot begin) -- +(axis direction cs:0,0,1) node [anchor=west] {$n$};
\addplot3[
samples y=0,
smooth, thick, color=green,
domain=0:2
] ({x},{0},{sqrt(2-x^2/2)});
\addplot3[
samples y=0,
smooth, thick, color=red,
domain=0:2
] ({x},{4-x^2},{0});
\end{axis}
\end{tikzpicture}
\end{document}
第二个示例的代码:
\documentclass[border=5mm]{standalone}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\begin{document}
\par\begin{tikzpicture}
\begin{axis}[
scale=2,
x={(-0.6cm,-0.3cm)}, y={(.6cm,0.0cm)}, z={(0cm,.6cm)},
xlabel={$x$}, ylabel={$y$}, zlabel={$z$},
axis lines=middle, axis on top,
xtick={1}, ytick={2},ztick={1},
enlargelimits,
clip=false
]
\addplot3[
samples y=0,
smooth, thick, color=blue,
domain=0:sqrt(2)
] ({0},{4-2*x^2},{x}) coordinate [pos=0.3] (trihedron origin) ;
\draw [-latex,color=violet,thick] (trihedron origin) -- +(axis direction cs:0,0,1)
node [anchor=west] {$ds$};
\draw [-latex,color=violet,thick] (trihedron origin) -- +(axis direction cs:1,0,0)
node [inner sep=1pt, anchor=south east] {$dt$};
\draw [-latex,color=violet,thick] (trihedron origin) -- +(axis direction cs:0,1,0)
node [anchor=north] {$n$};
\addplot3[
samples y=0,
smooth, thick, color=green,
domain=0:2
] ({x},{0},{sqrt(2-x^2/2)});
\addplot3[
samples y=0,
smooth, thick, color=red,
domain=0:2
] ({x},{4-x^2},{0});
\end{axis}
\end{tikzpicture}
\end{document}