以下脚本:
set view map
set dgrid3d 2,2
splot "-" with points title "Data"
0 0 1
0 1 2
1 0 3
1 1 4
e
在图的四个角上绘制四个点。有没有办法扩展范围,以便边框和点之间有一个小的边距?
我知道这可以使用xrange或yrange命令来完成。但我更喜欢说一个10pt的空间位于最外面的点和边界之间。
解决方案如:
也会很好。
感谢任何提示,链接和帮助!
提前致谢
Woltan
答案 0 :(得分:1)
这取决于你想做什么。
AFAIK(我不是gnuplot内部的专家)gnuplot通过了很多关于如何实际绘制终端的情节。因此,xrange和yrange将能够在两侧给你一点额外的内容,但实际上(实际上)多少空间将取决于绘图的大小(因此png小到png大不同 - 例如)。
如果你想准确控制大小,那么我认为你需要直接使用特定的终端,而不是使用gnuplot。但是,Gnuplot确实支持各种终端。对于此任务,使用metapost终端mp可能最简单。 这可以让你改变边框的位置和抽搐完全
要实现这一点,您需要使用脚本
set term mp latex
set output "xrange_example.mp"
set view map
set dgrid3d 2,2
splot "-" with points title "Data"
0 0 1
0 1 2
1 0 3
1 1 4
e
set output
set term pop
你的乳胶文件(假设你正在使用它)
\documentclass{scrartcl}
\usepackage{emp,ifpdf}
\ifpdf
\DeclareGraphicsRule{*}{mps}{*}{}
\fi
\begin{document}
\includegraphics{xrange_example.0}
\end{document}
然后使用
生成图像> TEX=latex
> gnuplot your_gnuplot.gp
> mpost xrange_example.mp
> pdflatex xrange.tex
您更改的是xrange_example.mp文件。如果你打开它,你会发现(大约一半)
beginfig(0);
w:=5.000in;h:=3.000in;
a:=w/1200.0;b:=h/720.0;
a和b指定宽度和高度的缩放。 之后添加
numeric x[], y[];
x[0] = -10pt;
x[1] = 10pt;
y[0] = -10pt;
y[1] = 10pt;
这些介绍了您要添加到边框和抽搐的距离。 抽搐定义如下
draw (193.0a,591.2b)--(193.0a,569.6b); % On the left
draw (355.8a,165.4b)--(355.8a,187.0b); % on the right
put_text( btex 0.2 etex, 355.8a, 117.8b, 0, 2); % the text
您想要像这样修改这些
draw (193.0a+x[0],591.2b)--(193.0a+x[0],569.6b); % On the left
draw (355.8a+x[1],165.4b)--(355.8a+x[1],187.0b); % on the right
put_text( btex 0.2 etex, 355.8a+x[0], 117.8b, 0, 2); % the text
正如您所看到的,使用搜索和替换(或在脚本中)很容易,因为您只修改数字193.0a,355.8a。
你需要对xtics和边框
做同样的事情draw (192.9a,591.2b)--(192.9a,165.3b)--(1007.0a,165.3b)--(1007.0a,591.2b)--(192.9a,591.2b);
总的来说,我认为你必须改变8个数字(很多次 - 非常易于编写)。
例如,我将plot sin(x)
的pdf包含在修改过的边框中。边界已被完全10pt 修改。 (您可以选择mm或cm或英寸等)
答案 1 :(得分:1)
我发现有以下几种因素来抵消边界:
set view map
set dgrid3d 2,2
splot "-" with points title "Data"
0 0 1
0 1 2
1 0 3
1 1 4
e
save set "Tmp.txt"
system("python SetRange.py Tmp.txt 1.1")
load "Tmp.txt"
splot "-" with points title "Data"
0 0 1
0 1 2
1 0 3
1 1 4
e
如您所见,gnuplot的状态保存在文件Tmp.txt中。在其他情况下,如果从文件中读取数据,则可以用重新绘制替换较低的splot命令。
通过系统调用,您可以修改临时文件中xrange和yrange的条目。我用python脚本做到了,因为我对awk ^^不太好。
import os
import sys
class Range(object):
def __init__(self, line, factor):
self.Line = line
self.Factor = factor
self.min, self.max = self._GetRange(self.Line)
self.min_new, self.max_new = self._SetRange(self.min, self.max, self.Factor)
def Write(self, file):
Line_new = self.Line[0:self.Line.find("*")]
Line_new = Line_new + str(self.min_new) + ":" + str(self.max_new)
Line_new = Line_new + self.Line[self.Line.find("]") : self.Line.find("#")]
file.write(Line_new + "\n")
def _GetRange(self, line):
min, max = (line[line.rfind("[") + 1 : line.rfind("]")]).split(":")
return (float(min), float(max))
def _SetRange(self, min, max, factor):
dist_new = (max - min) * factor
mean = (max - min) / 2 + min
min_new = mean - dist_new / 2
max_new = mean + dist_new / 2
return (min_new, max_new)
if __name__ == '__main__':
if not os.path.exists(sys.argv[1]):
raise Exception("Cannot find file " + sys.argv[1])
file = open(sys.argv[1])
fileContents = file.read().split("\n")
file.close()
if len(sys.argv) > 2:
factor = float(sys.argv[2])
else:
factor = 1.05
for line in fileContents:
if line.find("set xrange") != -1:
xrange = Range(line, factor)
elif line.find("set yrange") != -1:
yrange = Range(line, factor)
file = open(sys.argv[1], "w")
xrange.Write(file)
yrange.Write(file)
file.close()
如果用awk做一个较短的方法,我会非常乐意知道;)
Cherio Woltan