PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rechnen in PSTricks



DaPhil
25-11-2010, 16:59
Hallo,
ich möchte mit PSTricks einen Graphen erstellen. Das funktioniert auch soweit. Jetzt möchte ich noch ein paar Parameter berechnen, damit ich das nicht für jeden Graphen einzeln machen möchte. Allerdings funktioniert das nicht ganz. Hier mein Versuch:


\listfiles
\documentclass[12pt,a4paper]{article}

\usepackage{graphicx}

\usepackage{pst-all}
\usepackage{pstricks-add}
\usepackage{auto-pst-pdf}

\begin{document}

\begin{figure}
\begin{postscript}
\newlength\xlength \setlength\xlength{13cm}
\newlength\ylength \setlength\ylength{8cm}
\newlength\zero \setlength\zero{5cm}

\def\xmin{500}
\def\xmax{3000}
\def\ymin{0}
\def\ymax{5}

\makeatletter
\def\myxunit{
\pst@number\xlength \pst@number\ylength sub
}
\makeatother
% hier dann meine Zeichenkommandos
\end{postscript}
\caption{Image done with pstricks.}
\end{figure}
\end{document}

Kann mir jemand helfen?

mechanicus
25-11-2010, 17:52
Hi,

was genau willst du denn erreichen?

Gruß
Marco

DaPhil
25-11-2010, 18:49
Ich möchte mir die Größe für das grid ausrechnen, damit ich das nicht per Hand für jeden Graphen machen muss. D.h. ich gebe beim Graphen nur an, von wo bis wo ich meine Daten habe und wie große der Graph werden soll, und ich errechne mir von wo bis wo mein grid laufen muss. Beispiel:


\newlength\xlength \setlength\xlength{13cm}
\newlength\ylength \setlength\ylength{8cm}

\def\xmin{500}
\def\xmax{3000}
\def\ymin{0}
\def\ymax{5}

Hier habe ich angegeben, dass meine x-Achse von 500 bis 3000, die y-Achse von 0 bis 5 läuft. Der Graph soll insgesamt 13cmx8cm groß sein. Das grid muss dann so aussehen:


\psgrid[
xunit=2.6cm,
yunit=1.6cm,
griddots=20,
subgriddiv=0,
gridlabels=0pt,
gridwidth=0.5pt,
gridcolor=black
](1,0)(6,5)

Denn: xunit=13/((3000-500)/Dx) wobei Dx die Schrittgröße in \begin{psgraph} ist, die hier 500 ist.

mechanicus
25-11-2010, 18:51
Hi,

kennst du die Umgebung psgraph?

Gruß
Marco

DaPhil
25-11-2010, 19:00
Jaja, die benutz ich ja. Hier mein kompletter Code, aber die Daten die ich einbinde sind nicht dabei:


\listfiles
\documentclass[12pt,a4paper]{article}

\usepackage{graphicx}

\usepackage{pst-all}
\usepackage{pstricks-add}
\usepackage{auto-pst-pdf}

\begin{document}

\begin{figure}
\begin{postscript}
\newlength\xlength \setlength\xlength{13cm}
\newlength\ylength \setlength\ylength{8cm}

\def\xmin{500}
\def\xmax{3000}
\def\ymin{0}
\def\ymax{5}

\makeatletter
\def\myxunit{
\pst@number\xlength \pst@number\ylength sub
}
\makeatother

\psset{
xAxisLabelPos={c,-0.9cm},
yAxisLabelPos={-1.2cm,c},
xAxisLabel=Kanal \(\pi\),
yAxisLabel=Ereignisse
}
\begin{psgraph}[
axesstyle=frame,
comma=true,
ylogBase=10,
logLines=y,
Dx=500,
Dy=1,
Ox=500,
Oy=0,
showorigin=true,
linewidth=1pt,
ticks=all,
tickstyle=inner,
ysubticks=10,
xsubticks=5,
xticksize=5pt,
% xticklinestyle=dotted,
yticksize=5pt,
subticksize=0.5,
tickwidth=1pt,
linecap=1,
subtickcolor=black,
subtickwidth=1pt,
labels=all
](\xmin,\ymin)(\xmax,\ymax){\xlength}{\ylength}

\psgrid[
xunit=2.6cm,
yunit=1.6cm,
griddots=20,
subgriddiv=0,
gridlabels=0pt,
gridwidth=0.5pt,
gridcolor=black
](1,0)(6,5)

\readdata[nStep=10]{\data}{Daten_Caesium_test.txt}
\pstScalePoints(1,1){}{dup 0 gt {log} if}
\listplot[
plotNoMax=1,
plotNo=1,
nStep=1,
plotstyle=dots,
dotstyle=*,
dotsize=1pt,
linecolor=black,
linewidth=0.5pt,
showpoints=true,
xStart=\xmin,
xEnd=\xmax
]{\data}

\rput[tl](3cm,7.5cm){
\psframebox[linewidth=0.3pt,fillcolor=white,fillstyle=solid]{
\psset{unit=1cm}
\begin{pspicture}(2,0.2)
\psdot[dotsize=1pt,linecolor=black](0,0.1)
\uput[r](0,0.1){Messdaten}
\end{pspicture}
}
}
\end{psgraph}
\end{postscript}
\caption{Image done with pstricks.}
\end{figure}

\end{document}

voss
25-11-2010, 19:19
Hier habe ich angegeben, dass meine x-Achse von 500 bis 3000, die y-Achse von 0 bis 5 läuft. Der Graph soll insgesamt 13cmx8cm groß sein. Das grid muss dann so aussehen:


\psgrid[
xunit=2.6cm,
yunit=1.6cm,
griddots=20,
subgriddiv=0,
gridlabels=0pt,
gridwidth=0.5pt,
gridcolor=black
](1,0)(6,5)

Denn: xunit=13/((3000-500)/Dx) wobei Dx die Schrittgröße in \begin{psgraph} ist, die hier 500 ist.

Wozu willst du \psgrid verwenden, das kannst du doch alles
mit psgraph machen??

Herbert

DaPhil
25-11-2010, 21:01
Wie? Ich habe zwar die Möglichkeit, ein grid mit den ticks zu zeichnen, aber dann habe ich erstens keine ticks, und zweitens ist der grid dann nicht sehr schön. Wenn sich 2 grid Linien treffen, dann sind die Punkte nicht übereinander... Das sieht mit \psgrid einfach schöner aus! Deswegen möchte ich \psgrid benutzen. Zum Vergleich mein Versuch den grid nur mit \begin{psgraph} zu machen:


\begin{psgraph}[
axesstyle=frame,
Dx=5,
Dy=5,
Ox=0,
Oy=0,
showorigin=true,
linewidth=0.5pt,
ticks=all,
tickstyle=inner,
ysubticks=5,
xsubticks=5,
xticksize=0 20,
yticksize=0 15,
ticklinestyle=dotted,
subticksize=0,
tickwidth=0.4pt,
linecap=1,
subtickcolor=black,
subtickwidth=0.5pt,
labels=all
](0,0)(15,20){0.4\linewidth}{0.3\linewidth}

voss
26-11-2010, 12:30
Wie? Ich habe zwar die Möglichkeit, ein grid mit den ticks zu zeichnen, aber dann habe ich erstens keine ticks, und zweitens ist der grid dann nicht sehr schön. Wenn sich 2 grid Linien treffen, dann sind die Punkte nicht übereinander... Das sieht mit \psgrid einfach schöner aus! Deswegen möchte ich \psgrid benutzen. Zum Vergleich mein Versuch den grid nur mit \begin{psgraph} zu machen:


du zeichnest einfach nochmal die Achse ohne label:

\documentclass[12pt,a4paper]{article}

\usepackage{graphicx}
\usepackage{pstricks-add}
\usepackage{auto-pst-pdf}

\begin{document}

\begin{figure}
\begin{postscript}
\psset{
xAxisLabelPos={c,-0.9cm},
yAxisLabelPos={-1.2cm,c},
xAxisLabel=Kanal \(\pi\),
yAxisLabel=Ereignisse,
llx=-1cm,lly=-5mm,
}
\begin{psgraph}[
axesstyle=frame,
comma=true,
ylogBase=10,
logLines=y,
Dx=500,
Dy=1,
Ox=500,
Oy=0,
showorigin=true,
linewidth=1pt,
ticks=all,
tickstyle=inner,
ysubticks=10,
xsubticks=5,
xticksize=5pt,
% xticklinestyle=dotted,
yticksize=5pt,
subticksize=0.5,
tickwidth=1pt,
linecap=1,
subtickcolor=black,
subtickwidth=1pt,
labels=all](500,0)(3000,5){13cm}{8cm}
\psaxes[Dx=500,labels=none,ticklinestyle=dashed,tickcolor= black!20,
xticksize=0 8cm,yticksize=0 13cm
](500,0)(3000,5)
% \readdata[nStep=10]{\data}{Daten_Caesium_test.txt}
\pstScalePoints(1,1){}{dup 0 gt {log} if}
\listplot[
plotNoMax=1,
plotNo=1,
nStep=1,
plotstyle=dots,
dotstyle=*,
dotsize=1pt,
linecolor=black,
linewidth=0.5pt,
showpoints=true,
]{0 1 1 2 3 3 4 6}
\rput[tl](3cm,7.5cm){%
\psframebox[linewidth=0.3pt,fillcolor=white,fillstyle=solid]{%
\psdot[dotsize=1pt,linecolor=black](0,0.1)~Messdaten}}
\end{psgraph}
\end{postscript}
\caption{Image done with pstricks.}
\end{figure}

\end{document}
Beispiel enthält auch eine vereinfachte \rput-Anweisung.

Herbert

DaPhil
26-11-2010, 13:19
Ok, aber: Wenn ich ticklinestyle=dotted benutze, sind die Punkte wieder sehr unschön. Kann ich also nicht die Werte nehmen die ich oben definiere, also xmin xmax usw und mir daraus einen neuen Wert berechnen? Das wäre für mich gerade die einfachste Lösung, wenn es denn geht.
Und, kann man irgendwie auf die Werte zugreifen, die pstricks intern benutzt um zu zeichnen? Beispielsweise die Koordinaten der oberen linken Ecke?
Danke trotzdem für die Hilfe.

voss
26-11-2010, 14:33
Ok, aber: Wenn ich ticklinestyle=dotted benutze, sind die Punkte wieder sehr unschön. Kann ich also nicht die Werte nehmen die ich oben definiere, also xmin xmax usw und mir daraus einen neuen Wert berechnen? Das wäre für mich gerade die einfachste Lösung, wenn es denn geht.
Und, kann man irgendwie auf die Werte zugreifen, die pstricks intern benutzt um zu zeichnen? Beispielsweise die Koordinaten der oberen linken Ecke?



\pstFPdiv\psttempA{13}{5}% werte kannst du mit \xMin usw ersetzen.
\pstFPdiv\psttempB{8}{5}
\psgrid[
xunit=\psttempA cm,
yunit=\psttempB cm,
griddots=20,
subgriddiv=0,
gridlabels=0pt,
gridwidth=0.5pt,
gridcolor=black](1,0)(6,5)

Herbert

DaPhil
26-11-2010, 16:29
Ah, das klappt, sehr vielen Dank! Die Koordinaten, die genutzt werden um die Ecken des Koordinatensystems zu zeichnen kann man aber nicht benutzen?

voss
26-11-2010, 17:06
Ah, das klappt, sehr vielen Dank! Die Koordinaten, die genutzt werden um die Ecken des Koordinatensystems zu zeichnen kann man aber nicht benutzen?

die werden einfach an PostScript weitergereicht. Wenn du da
was machen willst, dann geht das nur über

\pstVerb{...}

Um zu verstehen, wie das Gitter gezeichnet wird, musst du dir
die PS-Funktion Grid in pstricks.pro ansehen.

Herbert

DaPhil
26-11-2010, 21:43
Also ich hab mir die Datei mal angeschaut... Und ich habe keine Ahnung wie ich da jetzt die Koordinaten herausbekomme...

voss
27-11-2010, 08:11
Also ich hab mir die Datei mal angeschaut... Und ich habe keine Ahnung wie ich da jetzt die Koordinaten herausbekomme...

mach ein _komplettes_ Beispiel, was auch durchläuft. Anstelle der
zu berechnen Werte kannst du auch erst irgendwelche Zahlen nehmen
und schreibst daneben, was es eigentlich sein sollte. Bsp:

...=12 % hier eigentlich obere linke Ecke.

Herbert

DaPhil
27-11-2010, 09:39
\listfiles
\documentclass[12pt,a4paper]{article}

\usepackage{graphicx}

\usepackage{pst-all}
\usepackage{pstricks-add}
\usepackage{auto-pst-pdf}

\begin{document}

\begin{figure}
\centering
\begin{postscript}
\begin{psgraph}[
axesstyle=frame,
comma=true,
showorigin=true,
linewidth=1pt,
ticks=all
](0,0)(5,1.5){8 cm}{6 cm}

\rput[tl](1cm,1cm){%hier eigentlich obere linke Ecke
\psframebox[linewidth=0.5pt,fillcolor=white,fillstyle=solid]{
~\psdot[dotsize=3pt,dotstyle=Bo,fillcolor=white,linecolor= black](0,0.025)~\scriptsize{Messdaten}
}
}

\end{psgraph}
\end{postscript}
\caption{Image done with pstricks.}
\end{figure}
\end{document}

Wie bekommt man in der Framebox eine zweite Zeile? Mit \\ oder \par funktioniert es nicht, eine Tabelle einzufügen macht die Abstände zur Box wesentlich größer... Gibt es eine Möglichkeit, den Punkt, der in der Framebox steht, mittig vor die Schrift zu setzen, ohne zu raten welche Koordinate man eintragen muss (also hier habe ich 0.025 ausprobiert, ist aber nicht wirklich die Mitte)?

voss
27-11-2010, 12:05
Wie bekommt man in der Framebox eine zweite Zeile? Mit \\ oder \par funktioniert es nicht, eine Tabelle einzufügen macht die Abstände zur Box wesentlich größer... Gibt es eine Möglichkeit, den Punkt, der in der Framebox steht, mittig vor die Schrift zu setzen, ohne zu raten welche Koordinate man eintragen muss (also hier habe ich 0.025 ausprobiert, ist aber nicht wirklich die Mitte)?

Die Version pst-plot.tex von http://texnik.dante.de/tex/generic/pst-plot/
erlaubt die Benutzung von \pslegend, siehe Beispiel unten. Die Doku
http://texnik.dante.de/doc/generic/pst-plot/
beschreibt, wie man mehrzeilige Legenden eingeben kann.


\listfiles
\documentclass[12pt,a4paper]{article}

\usepackage{graphicx}

\usepackage{pst-all}
\usepackage{auto-pst-pdf}

\begin{document}

\begin{figure}
\centering
\begin{postscript}
\pslegend[lt]{$\bullet$ & Messdaten\\ & neue Zeile}
\begin{psgraph}[
axesstyle=frame,
comma=true,
showorigin=true,
linewidth=1pt,
ticks=all](0,0)(5,1.5){8 cm}{6 cm}
\end{psgraph}
\end{postscript}
\caption{Image done with pstricks.}
\end{figure}
\end{document}

Herbert

DaPhil
27-11-2010, 20:18
Ok, das werde ich mal ausprobieren. Noch ein Frage zur Rechnerei: Im ersten Beispiel skaliere ich die y Werte, bzw. ich werfe alle Punkte mit Wert 0 heraus, da es in einem log plot nicht angezeigt werden kann.

Ich möchte nun eine Funktion einfach skalieren, mit einem Faktor. Diesen möchte ich als Variable angeben. Etwa so:


\def\xfactor{1}
\def\yfactor{0.0001}
\pstScalePoints(1,1){\xfactor mul}{\yfactor mul}

Leider wird dann gar nichts mehr gezeichnet. Wo liegt mein Fehler?

mechanicus
27-11-2010, 20:36
\def\xfactor{1}
\def\yfactor{0.0001}
\pstScalePoints(1,1){\xfactor\space mul}{\yfactor\space mul}

Leider wird dann gar nichts mehr gezeichnet. Wo liegt mein Fehler?

Gruß
Marco

DaPhil
28-11-2010, 11:42
Also ich habe das mal ausprobiert mit der neuen Version von pst-plot. Mal angenommen ich möchte gar keine Legende haben, wie bekomme ich diesen leeren Kasten weg, der dann in eine Ecke gezeichnet wird, obwohl man \pslegend gar nicht benutzt? Dies ist sogar in der Doku zu sehen... Außerdem kann man dort nicht einstellen, welche Randstärke, Hintergrundfarbe etc. oder täusche ich mich?

voss
28-11-2010, 12:40
Also ich habe das mal ausprobiert mit der neuen Version von pst-plot. Mal angenommen ich möchte gar keine Legende haben, wie bekomme ich diesen leeren Kasten weg, der dann in eine Ecke gezeichnet wird, obwohl man \pslegend gar nicht benutzt? Dies ist sogar in der Doku zu sehen... Außerdem kann man dort nicht einstellen, welche Randstärke, Hintergrundfarbe etc. oder täusche ich mich?

geht jetzt mit dieser pst-plot.tex Version:
http://texnik.dante.de/tex/generic/pst-plot/

\newpsstyle{legendstyle}{fillstyle=...,...}

damit kannst du alles umdefinieren. Siehe Doku

Herbert

DaPhil
28-11-2010, 13:28
2 Fragen:
1. Ich zeichne mittels \psgrid nach Benutzung von \pslegend. Das grid wird dann aber über die Legende gezeichnet.
2. Ich habe versucht mittels \pstVerb{\lb} auf die Koordinate der unteren linken Ecke zuzugreifen um sie selbst zu benutzen. Leider geht das nicht. Ich möchte die Variable benutzen, um den Abstand zur x- und y-Achse zu vergrößern. D.h. ich bastele mir meine eigene Legende mit den Koordinaten lbx+5mm und lby+10mm. So als Beispiel. Kann ich überhaupt auf die Variable so zugreifen?

voss
28-11-2010, 14:32
2 Fragen:
1. Ich zeichne mittels \psgrid nach Benutzung von \pslegend. Das grid wird dann aber über die Legende gezeichnet.


das stimmt, das muss ich ändern.


2. Ich habe versucht mittels \pstVerb{\lb} auf die Koordinate der unteren linken Ecke zuzugreifen um sie selbst zu benutzen. Leider geht das nicht. Ich möchte die Variable benutzen, um den Abstand zur x- und y-Achse zu vergrößern. D.h. ich bastele mir meine eigene Legende mit den Koordinaten lbx+5mm und lby+10mm. So als Beispiel. Kann ich überhaupt auf die Variable so zugreifen?

dazu brauchst du nur "labelsep=was_auch_immer" zu setzen.

Herbert

DaPhil
28-11-2010, 15:24
Also das mit labelsep funktioniert nicht...


\listfiles
\documentclass[12pt,a4paper]{article}

\usepackage{graphicx}

\usepackage{pst-all}
\usepackage{pstricks-add}
\usepackage{auto-pst-pdf}

\begin{document}

\begin{figure}
\centering
\begin{postscript}
\psset{
xAxisLabelPos={c,-0.9cm},
yAxisLabelPos={-1.2cm,c},
xAxisLabel=Kanal,
yAxisLabel=Ereignisse
}

\newpsstyle{legendstyle}{labelsep=100}

\pslegend[lt]{
~~\psdot[dotsize=3pt,dotstyle=Bo,fillcolor=white,linecolor= black](0,0.06)~~\scriptsize{Messdaten}
}

\begin{psgraph}[
axesstyle=frame
](-1,-1)(5,5){8 cm}{6 cm}
\end{psgraph}
\end{postscript}
\caption{Image done with pstricks.}
\end{figure}

\end{document}

voss
28-11-2010, 16:23
Also das mit labelsep funktioniert nicht...


Es gibt jetzt \pslegend[pos](xOffset,yOffset){text}, wobei der Offset
optional ist; ohne Angabe wird \pslabelsep genommen. Die Angaben
müssen ohne Einheit sein, aber in pt, also (28,28) ist ungefähr (1cm,1cm)

Das ganze ist noch ein wenig mit heißer Nadel gestrickt ... :D

Außerdem gibt es die vier Variablen \psgraphLLx, \psgraphLLy, \psgraphURx
und \psgraphURy (siehe Doku)

Herbert