GnuplotTex:自动绘图和垂直线指示

GnuplotTex:自动绘图和垂直线指示

我正在使用带有gnuplottex包的 pdflatex 来绘制具有局部最大值的函数;我想自动找到这个最大值并标记它。

在很大程度上,我已经在那里了(使用>4.4+中的特殊“伪”文件 ' 'gnuplot),除了几个问题——我不确定问题出在 LaTeX 还是gnuplot......这是一个最小的工作示例:

% build with:
% pdflatex -shell-escape test.tex

\documentclass{article}
\makeatletter\newwrite\verbatim@out\makeatother
\usepackage{gnuplottex}

\begin{document}

\section{Test}

Here a brief test...

\begin{figure}[h]
\centering
\begin{gnuplot}[scale=0.95]
  # Define helper functions
  ismax(x) = (x>max)?max=x:0
  isxmax(x) = (ismax(f(x))!=0)?xmax=x:0 #

  # Initialise the 'global' vars
  max=-1e38
  xmax=-1e38
  min=1e38
  ymaxrange=0.05 # added

  set grid
  set title 'gnuplottex test'
  set ylabel '$y$'
  set xlabel '$x$'
  set xrange [0:2000]
  set yrange [0:ymaxrange] # MUST set this!

  # define the function
  f(x) = (20*x)/(100000 + 50*x + x**2)

  set multiplot

  # plot f(x) # OK, works as usual

  # to turn off the annoying label in the upper right corner - also f($0) will cause latex crash
  set nokey

  # plot the function - which will also calculate xmax (first pass)

  plot '+' using ($1):(f($1)) with linespoints,       '+' using ($1):(isxmax($1)) with lines linecolor 2
  # '+' using ($1):(ismax(f($1))) with lines linecolor 2


  # second part of plot - which needs xmax

  set grid noxtics noytics # prevent double plot ?!
  set arrow from xmax,0 to xmax,3 nohead lt 1 linewidth 2 # linewidth doesn't change ?!

  set label "X" at xmax,f(xmax)
  set label "(%.0f;",xmax,"%f)",f(xmax) at 0.6*xmax,f(xmax)+ymaxrange/10

  plot '+' using ($1)
  # replot # nope, doubles
  unset multiplot
\end{gnuplot}
\end{figure}


500 1000 1500 ... End of test.

\end{document}

此代码的渲染结果如下(这是evince渲染 PDF 的屏幕截图):

gnuplottex 测试

这些是我的问题:

  • 似乎在执行第二个时plot,标签和轴会重复叠加在一起,尽管set grid noxtics noytics(注意,截图中它们颜色稍微暗一些)——这可以预防吗?
  • 原则上,如果没有该set yrange ...线,第二条线plot可能包含不同的自动范围(尽管在本例中看不到)。有没有办法“复制”/重复在中自动计算的轴的范围gnuplot
  • (用于实现垂直线)的linewidthlw)参数似乎没有任何效果——我该如何操作它?set arrow
  • 来自的线set arrow和来自绘图的(非常细的虚线)线isxmax($1)不匹配;看起来是arrow关闭了——如何解决这个问题?
  • 这个linecolor论点似乎没有效果——如何解决这个问题?(顺便说一句,颜色似乎工作正常\begin{gnuplot}[terminal=pdf,...,但是,我想保留 LaTeX“终端”

参考:

答案1

我会使用pgfplots包来实现这一点。您可以使用 gnuplot 生成数据\addplot gnuplot {<expression>};,然后使用 读取生成的数据\pgfplotstableread{\jobname.pgf-plot.table}\table。对该表进行排序后,您只需访问第一个元素,该元素现在包含局部最大值。

\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\begin{document}

\begin{tikzpicture}
\begin{axis}[ymin=0,ymax=0.05,xmin=0,xmax=2000,grid=both]

\addplot [domain={0:2000},samples=1000]
  gnuplot {(20*x)/(100000 + 50*x + x**2)};

\pgfplotstableread{\jobname.pgf-plot.table}\table
\pgfplotstablesort[sort cmp={float >},sort key={[index] 1}]\sorted{\table}
\pgfplotstablegetelem{0}{[index] 1}\of{\sorted}
\let\maxy=\pgfplotsretval
\pgfplotstablegetelem{0}{[index] 0}\of{\sorted}
\let\maxx=\pgfplotsretval


\node at (axis cs:\maxx,\maxy)
  [circle, fill, red,inner sep=1.5pt,
   pin={
    [fill=white]40:{(\pgfmathprintnumber{\maxx}, \pgfmathprintnumber{\maxy}})
   }
  ] {};
\draw [red] (axis cs:\maxx,0) -- (axis cs:\maxx,1);
\end{axis}
\end{tikzpicture}

\end{document}

使用 pgpflots 查找局部最大值

答案2

您的许多问题都与 GnuPlot 如何构造图形有关,与 TeX 关系不大。除非这里有一些 GnuPlot 专家,否则可以在他们的邮件列表中找到更多见解:

http://groups.google.com/group/comp.graphics.apps.gnuplot

至于无法从latex终端获得彩色输出的问题——我可以回答这个问题:GnuPlotlatex终端不会将任何颜色信息包含在picture它生成的代码中。您需要使用其他终端。


终点站epslatex

\begin{gnuplot}[scale=0.95,terminal=epslatex,terminaloptions=color]

如果使用pdflatex,您还需要将生成的 EPS 文件转换为 PDF。这可以通过安装该epstopdf工具并将以下内容添加到您的序言中来完成:

\usepackage[suffix=]{epstopdf}

但是,输入 EPS 感觉pdflatex就像是黑客行为。您可以使用其他 GnuPlot 终端来解决这个问题。


终点站tikz

\begin{gnuplot}[scale=0.95,terminal=tikz,terminaloptions=createstyle]

您还需要更改您的上面的 y 值arrow

set arrow from xmax,0 to xmax,3 nohead lt 1 linewidth 2

到:

set arrow from xmax,0 to xmax,ymaxrange nohead lt 1 linewidth 2

或者它会射入太空。

您的文档序言中必须添加以下内容:

\makeatletter
  % Tell gunuplottex to bring TikZ output in using \input rather
  % than \includegraphics
  \def\gnuplottexextension@tikz{\string tex}
\makeatother
\usepackage{tikz}
\usepackage{gnuplot-lua-tikz} % Generated by the createstyle option

结果是:

GnuPlot TikZ 输出


其他可能感兴趣的 GnuPlot 终端会生成 Metapost 和 PS-Tricks 输出。

相关内容