【发布时间】:2014-11-29 11:26:19
【问题描述】:
我正在使用这个最小的示例:
set xrange [0:10]
plot x**2
这会产生一个漂亮的平滑图。但是,我希望只有在 x (0, 1, 2, ..., 10) 的自然值上绘制点,使图表“刚性”,如下所示:
是否有可能在没有数据文件的情况下执行此操作?
我知道Gnuplot x-axis resolution,但是,如果我要使用它,我需要在每次更改 xrange 时调整样本分辨率。
【问题讨论】:
我正在使用这个最小的示例:
set xrange [0:10]
plot x**2
这会产生一个漂亮的平滑图。但是,我希望只有在 x (0, 1, 2, ..., 10) 的自然值上绘制点,使图表“刚性”,如下所示:
是否有可能在没有数据文件的情况下执行此操作?
我知道Gnuplot x-axis resolution,但是,如果我要使用它,我需要在每次更改 xrange 时调整样本分辨率。
【问题讨论】:
您可以使用管道命令而不是文件来为您提供所需的点:
plot "<seq 0 10" using 1:($1**2) w lp
请参阅此文档:http://www.chemie.fu-berlin.de/chemnet/use/info/gnuplot/gnuplot_13.html#SEC53,我引用:
在某些具有 popen 功能的计算机系统 (UNIX) 上,可以通过 shell 命令通过以“
显然,这也适用于某些 Windows 系统(使用 cygwin),尽管其他 Windows 平台失败并出现可悲的错误(见下文)。这似乎是因为 gnuplot 打开了一个 Windows 批处理 shell。
如果您尝试通过 system("command") 方式调用 shell 命令,您会得到更明确的错误(至少在我的 Windows 上):
gnuplot> plot "<echo 0 1 2 3 4 5 6 7 8 9 10" using 1:($1**2) w lp \
# fails, implying the < syntax doesn't even exist
warning: Skipping unreadable file "<echo 0 1 2 3 4 5 6 7 8 9 10"
No data in plot
gnuplot> plot system("echo 0 1 2 3 4 5 6 7 8 9 10") using 1:($1**2) w lp \
# fails with proper warning, then tries to reuse previous file
warning: system() requires support for pipes
warning: Skipping unreadable file "<echo 0 1 2 3 4 5 6 7 8 9 10"
No data in plot
gnuplot> !pause # shows a windows batch window
【讨论】:
如果你想要积分,你可以使用伪文件"+"。它就像一个文件,在单个列中包含一系列数字。您必须设置 xrange。点数由set samples决定:
set xrange[-5:5]
set samples 11 # need 11 points: 0, 1, 2, ..., 10
plot "+" u 1:($1**2) with linespoints
编辑:
首先,这是真的:您不必为linespoints 使用'+'...
好的,这是怎么回事:
plot '+' u (floor($1)):(floor($1)**2) smooth unique w lp
仍然使用伪文件'+',它将其值向下舍入到下一个整数。作为日志,您确保sample 点的数量足够高,以至于在每个整数之间总是生成一个数字(假设是整个 yrange 的两倍),它可以工作。 smooth unique 防止在同一坐标上出现多个点。
【讨论】:
set samples(见底部的链接),以及为什么我不想使用它。
plot x**2 with linespoints 的效果完全相同,+ 文件在这里没有用。