PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gegenläufige Achsen mit pstricks/pst-plot



Emcc
25-01-2008, 18:11
Mojn Mojn erstmal.

Ich möchte ein IR-Spektrum mit PSTricks bzw. pst-plot erstellen. Das Problem daran ist das solche Spektren normalerweise eine Auftragung der Transmission gegen die Wellenzahl darstellen. Die Wellenzahl sinkt von links nach rechts von (ca.) 4000 auf 400. Ich hab das Spektrum auch abbilden können aber ich bekomme immer nur eine ansteigende x-Achse hin.

Ändere ich was am Ox-Wert oder am Koordinatenursprung so setzt er die y-Achse nach links oder zählt bei der x-Achse von 4000 aus weiter hoch (von l -> r).

Ich benutze Windows XP:TeXnicCenter:MikTeX 2.6
Anbei ein minimalbeispiel welches geht aber das ist halt falschrum.

-------------------------------------------------------------------
\usepackage{pstricks}
\usepackage{pstricks-add}
:
:
:
\psset{xunit=0.004cm,yunit=0.2cm}
\begin{pspicture}(400,70)(4000,100)
\fileplot{TAP2.txt}
\psaxes[Dy=10,Dx=500,Ox=400,Oy=70]{->}(400,70)(400,70)(4000,100)
\end{pspicture}
------------------------------------------------------------------

Ich hoffe das es nicht ganz billig ist ich hab die Lösung echt nach langen suchen in mehreren Docus nicht gefunden.

Danke im vorraus.

voss
26-01-2008, 15:37
Mojn Mojn erstmal.

Ich möchte ein IR-Spektrum mit PSTricks bzw. pst-plot erstellen. Das Problem daran ist das solche Spektren normalerweise eine Auftragung der Transmission gegen die Wellenzahl darstellen. Die Wellenzahl sinkt von links nach rechts von (ca.) 4000 auf 400. Ich hab das Spektrum auch abbilden können aber ich bekomme immer nur eine ansteigende x-Achse hin.

Ändere ich was am Ox-Wert oder am Koordinatenursprung so setzt er die y-Achse nach links oder zählt bei der x-Achse von 4000 aus weiter hoch (von l -> r).



http://tug.org/PSTricks/main.cgi?file=pst-plot/psaxes

drittletzte Abbildung hat ganz verschiedene Achsen

Herbert

Emcc
26-01-2008, 17:52
@Voss: Das ist leider was völlig anderes. Dort wird jedem Wert über nen recht anspruchsvollen Code nen x-Wert auf der X-achse zugewiesen. Das mag mit 10-20 Werten ja noch machbar sein. Ich hab da aber 3600 Wertepaare!!!

Ich will ja eigendlich auch nicht mehr als das die x-Achse von 4000->400 (inklusive Wertepaare) läuft und nicht bestimmten Wertepaaren nen Label auf der x-Achse verpassen.

Unter GNU Plot ist das extrem simpel. Es kann doch nicht sein das es mit pst-plot nicht möglich ist. Wollte Grafiken halt direkt durch Quellcode einbringen und nicht mehr den Umweg über .eps- Grafiken machen.

@all: Ich würd mich über weitere Vorschläge mächtig freuen....

voss
26-01-2008, 20:14
@Voss: Das ist leider was völlig anderes. Dort wird jedem Wert über nen recht anspruchsvollen Code nen x-Wert auf der X-achse zugewiesen. Das mag mit 10-20 Werten ja noch machbar sein. Ich hab da aber 3600 Wertepaare!!!

Ich will ja eigendlich auch nicht mehr als das die x-Achse von 4000->400 (inklusive Wertepaare) läuft und nicht bestimmten Wertepaaren nen Label auf der x-Achse verpassen.

Unter GNU Plot ist das extrem simpel. Es kann doch nicht sein das es mit pst-plot nicht möglich ist. Wollte Grafiken halt direkt durch Quellcode einbringen und nicht mehr den Umweg über .eps- Grafiken machen.

@all: Ich würd mich über weitere Vorschläge mächtig freuen....



\documentclass{article}
\usepackage{pstricks-add}
\pagestyle{empty}
\setlength\parindent{0pt}
\begin{document}

\readdata{\data}{TAP2.txt}
\pstScalePoints(1,1){ 4000 sub neg }{}

\psset{xunit=0.003cm,yunit=0.2cm}

\begin{pspicture}(-10,60)(4000,110)
\psaxes[Dy=10,Oy=70,xAxis=false]{->}(0,70)(4000,110)
\psaxes[yAxis=false,xunit=-1,Dx=500,ticksize=0]{<-}(4000,70)(8000,100)
\psaxes[yAxis=false,Dx=500,labels=none](0,70)(4000,100)
\listplot[linewidth=2pt,linecolor=red]{\data}
\end{pspicture}

\end{document}

Herbert

Emcc
26-01-2008, 23:44
@Voss: Danke! der Code funzt.

Leider bekomme ich es nicht hin das die x-Achse bei 400 aufhört. Egal was ich mache sie läuft bis 0 runter. Hast du da vieleicht noch nen Tipp?

voss
27-01-2008, 10:03
@Voss: Danke! der Code funzt.

Leider bekomme ich es nicht hin das die x-Achse bei 400 aufhört. Egal was ich mache sie läuft bis 0 runter. Hast du da vieleicht noch nen Tipp?

sieht doch blöd aus ...



\begin{pspicture}(-10,60)(4000,110)
\psaxes[Dy=10,Oy=70,Dx=500,labels=y]{->}(0,70)(3600,110)
\multido{\iA=0+500,\iB=4000+-500}{8}{\uput[-90](\iA,70){\iB}}
\listplot[linewidth=2pt,linecolor=red]{\data}
\end{pspicture}


Herbert

Emcc
27-01-2008, 11:25
sieht doch blöd aus ...

Ansichtssache. Man gibts halt im Allg. so an. Da die Wellenzahl der Kehrwert aus der Wellenlänge ist würde man im Bereich zwischen 400 und 0 ja auch das gesammte restliche EM-Spektrum abbilden (Mikrowellen, Radiowellen.....).

So und ähnlich sieht das immer aus
IR-Spektroskopie (http://de.wikipedia.org/wiki/IR-Spektroskopie)
Nur wenns interessiert.

Danke auf jedenfall für den Code.

Mittlerweile hab ichs übrigens auch mit GNUplot hinbekommen PSTricksCode auszugeben, aber dein Code ist doch um einiges kompakter und besser Handhabbar.

DANKE!!!

voss
27-01-2008, 11:58
Ansichtssache. Man gibts halt im Allg. so an. Da die Wellenzahl der Kehrwert aus der Wellenlänge ist würde man im Bereich zwischen 400 und 0 ja auch das gesammte restliche EM-Spektrum abbilden (Mikrowellen, Radiowellen.....).

So und ähnlich sieht das immer aus
IR-Spektroskopie (http://de.wikipedia.org/wiki/IR-Spektroskopie)
Nur wenns interessiert.


Aber das ist eine andere Abbildung, wo es Sinn macht, weil es keine
Achsen gibt. Die Darstellung ist dann auch besser.


Herbert

Emcc
03-12-2008, 15:33
So nu bin ich dabei mehrere NMR-Spektren in eine Abbildung zu bringen um ne Konzentrationsabhängigkeit zu illustrieren. Da merk ich das ich wieder das selbe Problem wie oben hab und den Code zwar benutzt aber eigendlich nicht richtig versanden habe was du da gemacht hast.

Im besonderen verstehe ich den Teil nicht:


\psaxes[Dy=10,Oy=70,Dx=500,labels=y]{->}(0,70)(3600,110)
\multido{\iA=0+500,\iB=4000+-500}{8}{\uput[-90](\iA,70){\iB}

Warum geht die X-Achse im Ergebniss von 4000->500 läuft obwohl sie doch von dir anders deklariert ist. Und wie das mit dem Rest ist kann ich auch nicht nachvollziehen.

Vieleicht kann mir jemand ne Literatur empfehlen wo solche Probleme beschrieben werden oder vieleicht kann mal jemand die Syntax erläutern.

Mein aktuelles Problem sieht so aus:
(Windows XP, TeXnicCenter, MikTeX 2.6, *.txt-files im NMR-Spektrum.zip enthalten)


\documentclass[12pt]{scrartcl}
...
\usepackage{pstricks}
\usepackage{pstricks-add}
...
\begin{document}
...
\psset{xunit=5.66cm,yunit=1cm}
\begin{pspicture}(9.5,0)(7.20,4)
\fileplot{2.txt}
\fileplot{22.txt}
\psaxes[Dy=1,Dx=0.5,Ox=9.33,Oy=0]{-}(7.20,0)(7.20,0)(9.33,4)
...
\end{pspicture}
...
\end{document}


Wieder sollen die Achsen runter laufen von 9,33 -> 7,2 ppm.

Mir ist klar das der Code wieder so aussehen müßte wie im oberen Beispiel:


\begin{pspicture}(-10,60)(4000,110)
\psaxes[Dy=10,Oy=70,Dx=500,labels=y]{->}(0,70)(3600,110)
\multido{\iA=0+500,\iB=4000+-500}{8}{\uput[-90](\iA,70){\iB}}
\listplot[linewidth=2pt,linecolor=red]{\data}
\end{pspicture}

Aber ich habs nicht hinbekommen.
@Voss:Danke nochmal für die frühere Hilfe.

Emcc
03-12-2008, 15:59
Vieleicht kann mir jemand ne Literatur empfehlen wo solche Probleme beschrieben werden ...

Die Frage hätte ich mir wohl sparen können...

Voß, Herbert
PSTricks
Grafik mit PostScript für TeX und LaTeX

Find ich übrigens Prima das das IR-Beispiel auf der Seite (http://tug.org/PSTricks/main.cgi?file=pst-plot/psaxes) ist. ;-)

mechanicus
03-12-2008, 16:06
Im besonderen verstehe ich den Teil nicht:

\psaxes[Dy=10,Oy=70,Dx=500,labels=y]{->}(0,70)(3600,110)
\multido{\iA=0+500,\iB=4000+-500}{8}{\uput[-90](\iA,70){\iB}
Warum geht die X-Achse im Ergebniss von 4000->500 läuft obwohl sie doch von dir anders deklariert ist.
Hallo,

ich versuche dir das mal nahe zu bringen, aber vorab, mache mal ein update auf Miktex 2.7. (sowie aller Pakete) und zu der Literatur:
http://www.lob.de/cgi-bin/work/frameset_pop
So nun zu deinem Problem:
Mit diesem Code machst du folgendes

\psaxes[Dy=10,Oy=70,Dx=500,labels=y]{->}(0,70)(3600,110)
Du sagst latex, dass der ein Koordinatensystem (psaxes) anlegen soll. Dieses hat die Größe (0,70)(3600,110) , wobei die Enden einen Pfeil haben sollen{->}. Weiterhin legst du fest, dass nur die Y-Achse labels hat (labels=y). Dann sagst du ihm, dass der Ursprung der Y-Achse bei 70 ist und er die labels um 10 bei jedem Schritt erhöhen soll (Dy=10,Oy=70).

Der Befehl multido (so heißt auch das Paket) macht folgendes:

\multido{\iA=0+500,\iB=4000+-500}{8}{\uput[-90](\iA,70){\iB}}
Es ist eine Schleife welche 8 mal durchlaufen wird {8}. Du hast für diese Schleife zwei Integervariablen deklariert A und B (\iA , \iB). Diese haben einen Startwert von 0 bzw. 4000. In jedem Schleifendurchlauf dir die Variable A um 500 erhöht und B um -500 verkleinert(4000+-500). Mit dem lezten Ausdruck \uput[-90](\iA,70){\iB} legst du fest, was in jedem Durchlauf passieren soll. Also Uput, wobei die X-Variable und die Ausgabe variiert.

Gruß
Marco

Emcc
03-12-2008, 16:56
OK. Ich hab jetzt verstanden das der ganze multido-kram mir nur meine x-achsenwerte ausgibt.

Wenn ich mein Problem mit dem NMR-Spektrum auf das hier reduziere:


\readdata{\data}{2.txt}
%\pstScalePoints(1,1){ 9.3333 sub neg }{}
\psset{xunit=5.66cm,yunit=1cm}
\begin{pspicture}(7.10,0)(9.3333,4)
\listplot[linewidth=0.5pt]{\data}


bekomme ich auch mein Spektrum (natürlich falschrum).
lasse ich jetzt das %-Zeichen bei \pstScalePoints weg ist die Ausgabe leer.
beim o.g. beispiel ist dann nur das Spektrum anders (richtig) rum.
???

voss
03-12-2008, 19:12
OK. Ich hab jetzt verstanden das der ganze multido-kram mir nur meine x-achsenwerte ausgibt.

Wenn ich mein Problem mit dem NMR-Spektrum auf das hier reduziere:


\readdata{\data}{2.txt}
%\pstScalePoints(1,1){ 9.3333 sub neg }{}
\psset{xunit=5.66cm,yunit=1cm}
\begin{pspicture}(7.10,0)(9.3333,4)
\listplot[linewidth=0.5pt]{\data}


bekomme ich auch mein Spektrum (natürlich falschrum).
lasse ich jetzt das %-Zeichen bei \pstScalePoints weg ist die Ausgabe leer.
beim o.g. beispiel ist dann nur das Spektrum anders (richtig) rum.
???

das Spektrum ist nicht falsch herum. Es spielt doch keine Rolle, ob die Linien
von links nach rechts oder umgekehrt gezeichnet werden. Die Abbildung zeigt dir das:
oben normal, darunter mit umgekehrter Reihenfolge.


\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{pstricks-add}
\parindent=0pt

\begin{document}

\readdata{\data}{2.txt}
\readdata{\dataA}{22.txt}
\psset{xunit=5cm}
\begin{pspicture}(6.95,-0.2)(9.4,4)
\psaxes[Dx=0.5,Ox=7]{->}(7,0)(7,0)(9.4,4)
\listplot[linecolor=red,linewidth=0.6pt]{\data}
\listplot[linecolor=blue,linewidth=0.6pt]{\dataA}
\end{pspicture}

\begin{pspicture}(6.95,-0.2)(9.4,4)
\psaxes[Dx=0.5,Ox=7]{->}(7,0)(7,0)(9.4,4)
\listplot[ChangeOrder,linecolor=red,linewidth=0.6pt]{\data}
\listplot[ChangeOrder,linecolor=blue,linewidth=0.6pt]{\dataA}
\end{pspicture}

\end{document}

Herbert

Emcc
04-12-2008, 21:21
Also vorne weg das Problem ist gelöst mit folgendenem Code:



\begin{document}
...
\readdata{\dataI}{2.csv}
\readdata{\dataII}{6.csv}
\psset{xunit=6.3cm,yunit=1cm}
\begin{pspicture}(0,0)(2.2,18)
\psaxes[yAxis=false,Dx=0.2,labels=none]{-}(0,0)(2.2,18)
\uput[-90](0.2,0){9.1}
\uput[-90](0.4,0){8.9}
\uput[-90](0.6,0){8.7}
\uput[-90](0.8,0){8.5}
\uput[-90](1,0){8.3}
\uput[-90](1.2,0){8.1}
\uput[-90](1.4,0){7.9}
\uput[-90](1.6,0){7.7}
\uput[-90](1.8,0){7.5}
\uput[-90](2,0){7.3}
\listplot[linewidth=0.5pt]{\dataI}
\listplot[linewidth=0.5pt]{\dataII}
\uput[-90](1,-0.5){$\delta$ / ppm}
\end{pspicture}
...
\end{document}



1)... ich habe die Daten angepasst da ich jetzt verstanden hab was:
\pstScalePoints(1,1){ 9.3333 sub neg }{}
macht. Für alle anderen: von allen X-werten wird der größte Wert der x-Achse (hier 9.333) Subtrahiert danach das Vorzeichen gewechselt. Soviel zum mathematischem Werkzeug um generell den Achsenverlauf umzukehren. Sorry das ich auf sowas einfaches nicht selbst gekommen bin :( . Hab die Daten geändert damit die Rechnung nicht bei jedem Kompilieren gemacht werden muß.
2)... Den \multido Befehl hab ich nicht zum laufen gebracht aber das er das selbe macht wie oben (die ganzen \uput-Befehle) hab ich auch verstanden.
3)...
lasse ich jetzt das %-Zeichen bei \pstScalePoints weg ist die Ausgabe leer. ist klar da dann das Koordinatensystem der PSpictureumgebung nicht mehr im Bereich der scalierten (\pstscale...) Werte liegt.

@Voss:
das Spektrum ist nicht falsch herum. Es spielt doch keine Rolle, ob die Linien
von links nach rechts oder umgekehrt gezeichnet werden. Die Abbildung zeigt dir das:
oben normal, darunter mit umgekehrter Reihenfolge.
Das die Reihenfolge des Zeichnens keine Rolle spielt ist mir schon klar. Es sollten (wie du sicherlich verstanden hast) ja nur wieder die x-werte von groß nach klein laufen (links nach rechts).


Ein Problem bleibt: Ich wollte 8 solcher Spektren in eine Abbildung bringen aber TeX oder PsTricks oder wer auch immer macht nur 7 mit. Bei 8 sind es zu viele Daten. Kann man da irgendwas machen ausser Wertepaare aus den Daten manuell löschen?

mechanicus
04-12-2008, 21:31
2)... Den \multido Befehl hab ich nicht zum laufen gebracht aber das er das selbe macht wie oben (die ganzen \uput-Befehle) hab ich auch verstanden.

Das liegt wahrscheinlich daran, dass 0,2 kein integerwert ist. Hättest also anstatt \iA einfach \rA nehmen müssen.

Gruß
Marco

voss
04-12-2008, 23:54
1)... ich habe die Daten angepasst da ich jetzt verstanden hab was:
\pstScalePoints(1,1){ 9.3333 sub neg }{}
macht. Für alle anderen: von allen X-werten wird der größte Wert der x-Achse (hier 9.333) Subtrahiert danach das Vorzeichen gewechselt. Soviel zum mathematischem Werkzeug um generell den Achsenverlauf umzukehren. Sorry das ich auf sowas einfaches nicht selbst gekommen bin :( . Hab die Daten geändert damit die Rechnung nicht bei jedem Kompilieren gemacht werden muß.
2)... Den \multido Befehl hab ich nicht zum laufen gebracht aber das er das selbe macht wie oben (die ganzen \uput-Befehle) hab ich auch verstanden.
3)...
lasse ich jetzt das %-Zeichen bei \pstScalePoints weg ist die Ausgabe leer. ist klar da dann das Koordinatensystem der PSpictureumgebung nicht mehr im Bereich der scalierten (\pstscale...) Werte liegt.


Das die Reihenfolge des Zeichnens keine Rolle spielt ist mir schon klar. Es sollten (wie du sicherlich verstanden hast) ja nur wieder die x-werte von groß nach klein laufen (links nach rechts).



\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{pstricks-add}
\parindent=0pt

\begin{document}

\readdata{\data}{2.txt}
%\readdata{\dataA}{22.txt}

\pstScalePoints(1,1){9.3333 sub neg 7 add }{}
\psset{llx=-5mm,lly=-5mm}
\begin{psgraph}[yAxis=false,Dx=0.2,dx=-0.2,Ox=9.4](7,0)(9.4,4){\linewidth}{7cm}
\listplot[linecolor=red,linewidth=0.6pt]{\data}
%\listplot[linecolor=blue,linewidth=0.6pt]{\dataA}
\end{psgraph}


\psset{xunit=6.3cm,yunit=1cm}
\begin{pspicture}(7,0)(9.4,4)
\psaxes[yAxis=false,Dx=0.2,dx=-0.2,Ox=9.4](7,0)(9.4,4)
\listplot[linewidth=0.5pt]{\data}
%\listplot[linewidth=0.5pt]{\dataII}
\uput[-90](1,-0.5){$\delta$ / ppm}
\end{pspicture}

\end{document}




Ein Problem bleibt: Ich wollte 8 solcher Spektren in eine Abbildung bringen aber TeX oder PsTricks oder wer auch immer macht nur 7 mit. Bei 8 sind es zu viele Daten. Kann man da irgendwas machen ausser Wertepaare aus den Daten manuell löschen?

Die werden schon auf TeX-Ebene eingelsen. Mal sehen, was geht.

Herbert