绘制矢量场流

绘制矢量场流

所以我有矢量场${x^2+2*x*y,y^2+2*x*y},我想绘制“流”。quiverpgfplots确实会产生箭头(我将其标准化),但我认为流会让事情更容易理解。这是StreamPlotmathematica 创建的。

数学中的向量场图

在此处输入图片描述

我希望能够用 制作类似的东西,以便pgfplots能够保持风格一致性。也许如果我可以提取产生曲线的点,那么就可以用 绘制pgfplots

答案1

我用的是这个:https://mathematica.stackexchange.com/questions/19859/plot-extract-data-to-a-file最初。图中的第一个元素dynamicalStream是一个空字符串加上一个对象GraphicsComplex。我用 从图中提取了点points = dynamicalStream[[1]][[2]][[1]]。对其他人来说可能有所不同。Line从这个GraphicsComplex对象中提取的对象是使用(我为我这样做的方式道歉,可能有更好的方法)

lines = dynamicalStream[[1]][[2]][[2]][[2]][[3]][[2 ;; Length[ dynamicalStream[[1]][[2]][[2]][[2]][[3]]]] ].

我认为这不太可能有用,所以要么你找到一个更通用的方法,要么按照我的做法,手动找到要提取的列表的正确部分。

然后我创建了一个列表,其中每个元素本身就是每条线的点列表。这是用 完成的pointstable = Table[points[[#[[1]][[i]]]], {i, 1, Length[#[[1]]]}] & /@ lines。内部列表是通过遍历Line对象中的每个元素(这是列表中点的位置points)并提取正确的点来创建的。因此,您制作了一个与 相对应的点列表Line。然后将其映射到 中的每个Line对象上,lines因此最终列表具有所述形式。

然后,我将每个列表保存在单独的文本文件中: Export["line" <> IntegerString[#2] <> ".txt", #,"Table"] &~MapIndexed~pointstable 如链接中所述。

我策划了:

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{decorations.markings}
\tikzset{->-/.style={decoration={
  markings,
  mark=at position #1 with {\arrow{>}}},postaction={decorate}}}
  \tikzset{-<-/.style={decoration={
  markings,
  mark=at position #1 with {\arrow{<}}},postaction={decorate}}}

\begin{document}
    \begin{tikzpicture}[scale=1.5]
        \begin{axis}[axis lines=none]
            \foreach \i in {1,2,3,4,...,107}{
                \addplot[black,->-=0.5] table[]{line\i.txt};
            }
        \end{axis}
    \end{tikzpicture}
\end{document}

结果

仔细查看该链接后,我发现更简单的方法是:

points  = Cases[dynamicalStream, GraphicsComplex[data__] :> data, -3, 1][[1]]
lines = Cases[dynamicalStream, Line[data__] :> data, -3];
pointstable = Table[points[[#[[i]]]], {i, 1, Length[#]}] & /@ lines

相关内容