2011-02-24 2 views
1

Le script suivant:Modification de x et yrange?

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 

parcelles quatre points sur les quatre coins du diagramme. Existe-t-il un moyen d'étendre la plage, de sorte qu'il existe une petite marge entre la bordure et les points?

Je sais que cela peut être accompli en utilisant les commandes xrange ou yrange. Mais je préfère un moyen de dire qu'un espace de 10pt est entre le point le plus extérieur et la frontière.

Une solution comme:

  1. Obtenez le xmin actuelle et les valeurs Xmax
  2. faire des trucs de mathématiques avec les valeurs retournées et définir de nouvelles valeurs de Xmin et Xmax en conséquence.

Serait bien aussi.

Tout indice, lien et aide est apprécié!

Merci à l'avance

Woltan

+0

Qu'est-ce que vous essayez d'atteindre en fin de compte? À quel point voulez-vous être exact? La quantité d'espace dépendra souvent du terminal auquel vous avez tracé le graphique (par exemple, png petit ou géant). Cela a-t-il de l'importance si elle évolue ou voulez-vous toujours 10 pnts quelle que soit la taille? – Tom

Répondre

1

Je trouve la possibilité, pour compenser la frontière par un facteur:

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 

Comme vous pouvez le voir, l'état de gnuplot est sauvegardé dans un fichier Tmp.txt. Dans les autres cas, si les données sont lues à partir d'un fichier, la commande splot inférieure peut être remplacée par un replot.

Avec l'appel système, vous pouvez modifier les entrées de xrange et yrange dans le fichier temporaire. Je l'ai fait avec un script python, puisque je ne suis pas très bon avec 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() 

S'il y a une courte façon de le faire avec awk, je serais plus heureux de savoir;)

Cherio Woltan

1

Il dépend ce que vous voulez faire. AFAIK (je ne suis pas un expert sur les internes de gnuplot) gnuplot passe une grande partie de la façon dont l'intrigue est réellement faite au terminal. Donc xrange et yrange seront en mesure de vous donner un peu plus de chaque côté, mais combien d'espace cela est (exactement) dépendra de la taille de l'intrigue (donc ce sera différent pour png small à png large - par exemple).

Si vous voulez contrôler la taille exactement, alors je pense que vous devez travailler directement avec un terminal spécifique plutôt qu'avec gnuplot. Cependant, Gnuplot prend en charge un large éventail de terminaux. Pour cette tâche, il est probablement plus facile de travailler avec le terminal métapost. Cela vous permet de modifier les positions de la frontière et des tics exactement

Pour obtenir ce que vous travailler aurez besoin de votre script

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 

Et votre document de latex (en supposant que vous utilisez ce)

\documentclass{scrartcl} 

\usepackage{emp,ifpdf} 
\ifpdf 
\DeclareGraphicsRule{*}{mps}{*}{} 
\fi 
\begin{document} 

\includegraphics{xrange_example.0} 

\end{document} 

Vous pouvez ensuite générer votre image avec

> TEX=latex 
> gnuplot your_gnuplot.gp 
> mpost xrange_example.mp 
> pdflatex xrange.tex 

Il s'agit du fichier xrange_example.mp que vous modifiez. Si vous l'ouvrez, vous trouverez (à mi-chemin vers le bas)

beginfig(0); 
w:=5.000in;h:=3.000in; 
a:=w/1200.0;b:=h/720.0; 

a et b le spécifier l'échelle à la largeur et la hauteur. Après ces ajouter

numeric x[], y[]; 
    x[0] = -10pt; 
    x[1] = 10pt; 
    y[0] = -10pt; 
    y[1] = 10pt; 

Ces distances introduisons que vous allez ajouter à la frontière et les tics. Les tics sont définis comme si

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 

Vous souhaitez modifier ces comme si

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 

Comme vous pouvez le voir c'est facile à faire avec la recherche et remplacer (ou dans un script) parce que vous modifient seulement les nombres 193.0a, 355.8a.

Vous devez faire la même chose pour xtics et la frontière

draw (192.9a,591.2b)--(192.9a,165.3b)--(1007.0a,165.3b)--(1007.0a,591.2b)--(192.9a,591.2b); 

Au total, je pense que vous devez changer 8 chiffres (beaucoup de fois - très scriptable).

A titre d'exemple, j'inclus le pdf du plot sin(x) avec la bordure modifiée. La bordure a été modifiée par exactement 10pt. (Vous pouvez également choisir ce en mm ou cm ou pouces, etc.)

image

+0

Salut Tom, merci pour l'article très élaboré! C'est une idée intéressante et elle fait exactement ce que je veux. Je vais certainement garder cette solution à l'esprit. Cependant, je préférerais ne pas faire le détour par le latex. Peut-être y at-il moyen de faire fonctionner ce travail depuis gnuplot?!? – Woltan

Questions connexes