修改x和yrange?

时间:2011-02-24 15:06:54

标签: gnuplot

以下脚本:

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的空间位于最外面的点和边界之间。

解决方案如:

  1. 获取当前xmin和xmax值
  2. 使用返回的值做一些数学运算并相应地设置新的xmin和xmax值。
  3. 也会很好。

    感谢任何提示,链接和帮助!

    提前致谢

    Woltan

2 个答案:

答案 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或英寸等)

image

答案 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