我正在使用带有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 的屏幕截图):
这些是我的问题:
- 似乎在执行第二个时
plot
,标签和轴会重复叠加在一起,尽管set grid noxtics noytics
(注意,截图中它们颜色稍微暗一些)——这可以预防吗? - 原则上,如果没有该
set yrange ...
线,第二条线plot
可能包含不同的自动范围(尽管在本例中看不到)。有没有办法“复制”/重复在中自动计算的轴的范围gnuplot
? - (用于实现垂直线)的
linewidth
(lw
)参数似乎没有任何效果——我该如何操作它?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}
答案2
您的许多问题都与 GnuPlot 如何构造图形有关,与 TeX 关系不大。除非这里有一些 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 终端会生成 Metapost 和 PS-Tricks 输出。