gnuplot Hilfe für Latex

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Hi Leute,

wollte hier mein skript vorstellen, wo glaube ich noch viel am Style zu tun ist.
Allerdings bräuchte ich dazu eure Hilfe. Die Beschreibung steht
im Code.

Grüße Markus

Code: Alles auswählen

#!/usr/bin/env python
# encoding: utf8
#
# Autor: M a r k u s --> F e l d m a n n
#
# Lizenz: GPL
#
# Discription: Convert all *.eps files to *.pdf files,
# also create tables which may be inserted into your
# tex document. At least you need one file containing
# the extension *.dat which includes tables of numbers
# according the gnuplot format.
# You also may wish to change the gnuplot commands
# below.
# This script should be exist in the same directory
# where is your *.dat file.
#
# You also may convert only one *.dat file by switch
# the variable <convert_all_dat_files> to False.
# (See below.)
#
#
import os
import re
import subprocess


def create_eps(name_dat_file):
  name_plot_file = "."+name_dat_file.rstrip(".dat")+".plot"
  name_eps_file = name_dat_file.rstrip(".dat")+".eps"
  gnuplot_file = file(name_plot_file, 'w')
  gnuplot_commands ="""
  reset
  set encoding utf8
  set terminal postscript enhanced colo
  set output "%s"
  set xlabel "Signalamplitude/Einheiten -------->"
  set ylabel "U_{pp}/V des Signals ------->"
  set grid
  plot "%s" index 0 using ($1):(($3)/(2*sqrt(2))) title "A)mit 0dB" with lp ,\\
  "%s" index 1 using ($1):(($3)/(2*sqrt(2))) title "B)mit -6dB" with lp""" \
  %(name_eps_file, name_dat_file, name_dat_file)

  gnuplot_file.write(gnuplot_commands)
  gnuplot_file.close()
  return_code = subprocess.call("gnuplot " +name_plot_file \
                         +"; rm " +name_plot_file, \
                         shell=True)
  if return_code == 0:
    conv_eps_to_pdf(name_eps_file)
  else:
    print "Errorcode: ",return_code

def conv_eps_to_pdf(name_eps_file):
  name_pdf_file = name_eps_file.rstrip(".eps")+".pdf"
  subprocess.call("epstopdf " +name_eps_file \
                    +" --outfile=" +name_pdf_file, \
                  shell=True)

def convert_table(name_dat_file):
  laufende_nummer = 1
  letzte_zeile = ""
  name_tex_file = name_dat_file.rstrip(".dat")+str(laufende_nummer)+".tex"
  dat_file = file(name_dat_file, 'r')
  tex_file = file(name_tex_file, 'w')
  re_wert = re.compile('[\w\.-]+')
  re_leerzeile = re.compile('^\s*\Z')
  re_kommentar = re.compile('#')
  for j in dat_file.readlines():
    if not re_leerzeile.match(j) and letzte_zeile == "Leerzeile":
      laufende_nummer += 1
      name_tex_file = name_dat_file.rstrip(".dat")+str(laufende_nummer)+".tex"
      tex_file = file(name_tex_file, 'w')    
    if not re_leerzeile.match(j):      
      if not re_kommentar.search(j) and re_wert.search(j):
	str_zeile = ""
	for k in re_wert.findall(j):
	  str_zeile += k+" & "
	tex_file.write(str_zeile.rstrip(" & ")+"\\\ \hline\n")
	letzte_zeile = "ZeileMitWerten"
    else:
      if letzte_zeile == "ZeileMitWerten":
	tex_file.close()
	letzte_zeile = "Leerzeile"
      else:
	letzte_zeile = "Leerzeile"

  tex_file.close()
  dat_file.close()

if __name__ == '__main__':
  os.chdir(os.path.dirname(os.path.realpath( __file__ )))
  # Here you can switch to convert all
  # *.dat files in the directory of your script
  # or to convert only the *.dat file which name
  # belongs to the name of this script.
  # For example:
  # table2-1.py --> table2-1.dat
  #
  convert_all_dat_files = True
  if convert_all_dat_files is True:
    for i in os.listdir('.'):
      re_dat_files = re.compile('\w*\.dat\Z')
      if re_dat_files.match(i):
        convert_table(i)
        create_eps(i)
  else:
    re_name_this_script = re.compile('/[\w-]+\.py\Z')
    name_this_script = re_name_this_script.findall(__file__)
    name_dat_file = name_this_script[0].rstrip(".py").lstrip("/")+".dat"
    convert_table(name_dat_file)
    create_eps(name_dat_file)
Zuletzt geändert von feldmaus am Montag 23. Februar 2009, 23:50, insgesamt 7-mal geändert.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Was willst du mit den vielen Unterstrichen am Anfang eines Namens bewirken?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du solltest PEP8 lesen, denn dein Code sieht aus wie ein Zeichenwald von spaßigen Operatoren ``"."+_`` könnte glatt aus Perl stammen :) Generell würde man da sowieso eher zu String-Formattierung greifen statt alle Strings mit Plus zu verketten.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Och ich find die richtig schnucklig ... aber man sieht irgendwie nichts anderes als Striche ...

Btw: Wenn du deine Abkürzungen im Skript erklären musst, dann solltest du mal über die Namen nachdenken.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

derdon hat geschrieben:Was willst du mit den vielen Unterstrichen am Anfang eines Namens bewirken?
Ich meine ich hatte es noch Erinnerung, dass man möglichst versuchen sollte den Geltungsbereich von Variabeln soweit wie möglich einzuschränken,
um Namenskollisionen zu verhindern.

Besonders bei größeren Projekten sollte man das machen?!
Oder muss man das nicht?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Vorallem wenn man nicht in der Lage ist sinnvolle Namen zu finden ist dass sicherlich hilfreich, ansonsten sollte man es lassen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

feldmann_markus hat geschrieben:Ich meine ich hatte es noch Erinnerung, dass man möglichst versuchen sollte den Geltungsbereich von Variabeln soweit wie möglich einzuschränken,
um Namenskollisionen zu verhindern.

Besonders bei größeren Projekten sollte man das machen?!
Das gilt aber nur für Klasssen und die darin definierten Attribute. Die lokalen Variablen einer Funktion sind so oder so nicht von außen zu sehen[1] da macht das keinen unterschied. In keiner Sprache.

Außerdem ist ``_`` auch kein Allheilmittel und alles mit ``_`` prefixen stört mehr als dass es nutzt.

Und schließlich: dein Skript ist kein großes Projekt. Eigentlich nichtmal ein mittleres :) Da brauchst du auch kein Dependency Injection, Inversion of Control, Factory Pattern, Observer Pattern und Template Method Pattern.

Anderes Thema: sag mal, kennst du TikZ? Damit kann man auch tolle Plots machen und es gibt auch eine ziemlich umfassende Seite in der die Möglichkeiten mit TikZ zu plotten beschrieben werden. Ich finde es viel hübscher die Plots selbst ins Dokument einzubetten, als PDFs einzuhängen :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Leonidas hat geschrieben: Anderes Thema: sag mal, kennst du TikZ? Damit kann man auch tolle Plots machen und es gibt auch eine ziemlich umfassende Seite in der die Möglichkeiten mit TikZ zu plotten beschrieben werden. Ich finde es viel hübscher die Plots selbst ins Dokument einzubetten, als PDFs einzuhängen :)
Hey de witzka. Das sieht ja geil aus.
Ne das modul <Tikz> kannte ich noch nicht.
Kann <Tikz> denn auch auf Tabellen innerhalb des Latex Dokuments
zugreifen, sodass ich immer nur eine Tabelle aktualisieren müsste?

Die meisten meiner Grafiken liegen nur als diskrete Werte vor,
die ich dann interpolieren muss.
Also nix mit den schönen determinierten Funktionen.

Mein Skript setzt nämlich nur eine Tabelle voraus und daraus wird
dann eine latex Tabelle und 2 Bilder bereitgestellt, sodass man
nicht so viel rum kramen muss. Und man auch nicht so schnell
was vergisst.

Grüße Markus
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Ich sehe gerade, die Doku von <Tikz> enthalten 710 Seiten.
Ich wollte dieses Jahr noch mit meinem Diplom fertig werden.
Also nach meinem Studium werde ich mir <Tikz> nochmal
angucken, solange muss das warten. :-)
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Leonidas hat geschrieben:Das gilt aber nur für Klasssen und die darin definierten Attribute. Die lokalen Variablen einer Funktion sind so oder so nicht von außen zu sehen[1] da macht das keinen unterschied. In keiner Sprache.
Also gilt das nur für Instanzen von Klassen ?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich weiß nicht genau was TikZ alles kann, weil wie du siehst, der Autor von TikZ, Till Tantau (der auch das großartige Beamer-Package geschrieben hat) ein unglaublich mächstiges Tool gemacht hat. Selbst wenn es nicht geht, dann könnte man vermutlich ein Makro schreiben, dass es möglich macht.
Ich nutze TikZ zum Darstellen von GraphViz-Graphen (dot2tex) oder auch zum Setzen der Graphen (tkz-graph, tkz-berge).
feldmann_markus hat geschrieben:
Leonidas hat geschrieben:Das gilt aber nur für Klasssen und die darin definierten Attribute. Die lokalen Variablen einer Funktion sind so oder so nicht von außen zu sehen[1] da macht das keinen unterschied. In keiner Sprache.
Also gilt das nur für Instanzen von Klassen ?
Ja. Lokale Variablen sind nur zur Laufzeit einer Funktion gültig und nur innerhalb der Funktion sichtbar.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten