PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pstricks - Daten aus Datei plotten



DaPhil
25-05-2010, 15:01
Hallo,
kann man mit pstricks auch Daten aus einer Datei plotten, die mehr als 2 Reihen hat. Und wie sieht es mit Kommentarzeilen aus, wenn ich welche habe wird nix geplottet...

Karlo
25-05-2010, 15:25
Hallo,
hab das mal bei meinen Daten getestet. Kommentare hatten keinen Einfluss auf den Plot. (Genauso wenig wie Leerzeilen... ).
Was genau meinst du mit 2 Reihen? Mehrere Datensätze?

DaPhil
25-05-2010, 15:34
ich habe in der ersten reihe die x werte, in der zweiten die dispersionsrelation, in der dritten die zustandsdichte... ich moechte erst das eine dann das andere plotten. geht das. finde kein fragezeichen auf der verfluchten franzoesischen tastatur... nicht wundern. wie muss auskommentiert werden. ich habe rauten.

voss
25-05-2010, 15:41
ich habe in der ersten reihe die x werte, in der zweiten die dispersionsrelation, in der dritten die zustandsdichte... ich moechte erst das eine dann das andere plotten. geht das. finde kein fragezeichen auf der verfluchten franzoesischen tastatur... nicht wundern. wie muss auskommentiert werden. ich habe rauten.

was hältst du von einem Beispiel?
Nur mal so als Frage ...

Herbert

Karlo
25-05-2010, 15:45
Bei meinen Plots hab ich einfach mehrere Dateien genommen, soll heißen eine mit den Werten für (x,f_1(x)) und eine mit denen für (x,f_2(x)).
Das Auskommentieren hab ich mit % getestet.


was hältst du von einem Beispiel?
Herbert
Stimmt, Beispiele sind immer gut :)

lg
Karlo

Nachtrag: Einlesen und Plotten mache ich übrigens mittels "\readdata..." und "\listplot..."

DaPhil
25-05-2010, 21:06
Jo, sorry. Beispiel kommt.


\documentclass[12pt,a4paper]{scrbook}
\usepackage[applemac]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{caption}

\usepackage{pstricks}
\usepackage{pst-solides3d}
\usepackage{auto-pst-pdf}
\usepackage{pstricks-add}
\usepackage{pst-node}
\usepackage{pst-tree}
\usepackage{pst-plot}

\begin{document}

\psset{unit=5mm}
\begin{pspicture}(-1.2,-1)(8,8)
\fileplot[linecolor=red, plotstyle=dots]{1-d_phonon_1_atomic_base.txt}
\psaxes[Dx=2,
axesstyle=frame,
linewidth=0.5pt,
ticks=all,
tickstyle=top,
subticks=2,
ticksize=5pt,
tickwidth=0.5pt,
ticklinestyle={linecap=2},
subtickcolor=black,
subtickwidth=0.5pt]{}(10,7)
\end{pspicture}

\end{document}

Ok, auskommentieren hatte ich mit # versucht. Klappt mit % aber. datendatei ist angehängt. zusätzliche frage: wie kann ich es anstellen die ticks abzurunden? und die länge der subticks einstellen? mit subticksize=2.5pt bekomme ich eine fehlermeldung.

voss
25-05-2010, 22:03
Jo, sorry. Beispiel kommt.


\documentclass[12pt,a4paper]{scrbook}
\usepackage[applemac]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{caption}

\usepackage{pstricks}
\usepackage{pst-solides3d}
\usepackage{auto-pst-pdf}
\usepackage{pstricks-add}
\usepackage{pst-node}
\usepackage{pst-tree}
\usepackage{pst-plot}

\begin{document}

\psset{unit=5mm}
\begin{pspicture}(-1.2,-1)(8,8)
\fileplot[linecolor=red, plotstyle=dots]{1-d_phonon_1_atomic_base.txt}
\psaxes[Dx=2,
axesstyle=frame,
linewidth=0.5pt,
ticks=all,
tickstyle=top,
subticks=2,
ticksize=5pt,
tickwidth=0.5pt,
ticklinestyle={linecap=2},
subtickcolor=black,
subtickwidth=0.5pt]{}(10,7)
\end{pspicture}

\end{document}

Ok, auskommentieren hatte ich mit # versucht. Klappt mit % aber. datendatei ist angehängt. zusätzliche frage: wie kann ich es anstellen die ticks abzurunden? und die länge der subticks einstellen? mit subticksize=2.5pt bekomme ich eine fehlermeldung.

alles, was rot ist, ist völlig überflüssig für dein Beispiel.
In der Doku steht klar, wie man die subticks setzt, nämlich als Teil
oder Vielfaches der Ticks.
ticklinestyle={linecap=2},
geht so nicht, außerdem musst du schon um das 10-fache vergrößern,
um das überhaupt zu sehen. \psset{linecap=2} geht.

Herbert

DaPhil
25-05-2010, 22:52
Also mit \psset{linecap=2} bekomme ich keine abgerundeten ticks... und wie ich die spiegeln (d.h. ticks auf allen seiten, innen, labels aber nur unten und links) kann habe ich auch im manual nicht gefunden. und mein eigentliches problem, ob es geht die spalten anzugeben die geplottet werden sollen, konnte ich mit dem manual auch nicht lösen...

voss
25-05-2010, 23:13
Also mit \psset{linecap=2} bekomme ich keine abgerundeten ticks... und wie ich die spiegeln (d.h. ticks auf allen seiten, innen, labels aber nur unten und links) kann habe ich auch im manual nicht gefunden. und mein eigentliches problem, ob es geht die spalten anzugeben die geplottet werden sollen, konnte ich mit dem manual auch nicht lösen...

http://mirror.ctan.org/graphics/pstricks/contrib/pst-plot/pst-plot.pdf
S.62f

Herbert

Karlo
26-05-2010, 00:31
http://mirror.ctan.org/graphics/pstricks/contrib/pst-plot/pst-plot.pdf
S.62f

Herbert

Gut zuwissen, vlt brauch ich das auch nochmal :)

Hab das Beispiel mal bei mir getestet und hätte mal noch eine kleine Frage. Die Zeile

ticklinestyle={linecap=2},

brachte den Fehler "Line style `linecap=2' not defined.". Es hat dann zwar das ändern dieser Zeile in

linecap=1

die gewünschten abgerundeten ticks gebracht. Also eigentlich gelöst, aber wieso der Fehler? Weil bei euch scheint es ja zu klappen.

lg
Karlo

Edit:
Wer lesen kann ist klar im Vorteil....;)


ticklinestyle={linecap=2},
geht so nicht,...
hat sich also erledigt.

gute Nacht denn ...

DaPhil
27-05-2010, 11:55
Frage zum Mehrzeiligen plotten: Wie bekomme ich die Daten skaliert? Ich möchte eine logarithmische y-Achse! habe versucht:


\readdata[nStep=10]{\data}{\file}
\pstScalePoints(1,1){}{log}

\listplot[plotNoMax=2,plotNo=1]{\data}

Allerdings wird nix gezeichnet. Wenn ich die Datei so verändere dass nur noch 2 Zeilen da sind, funktionierts. Zusätzliche Frage: Wie bekomme ich einen logarithmischen Grid?

voss
27-05-2010, 12:10
Frage zum Mehrzeiligen plotten: Wie bekomme ich die Daten skaliert? Ich möchte eine logarithmische y-Achse! habe versucht:


\readdata[nStep=10]{\data}{\file}
\pstScalePoints(1,1){}{log}

\listplot[plotNoMax=2,plotNo=1]{\data}

Allerdings wird nix gezeichnet. Wenn ich die Datei so verändere dass nur noch 2 Zeilen da sind, funktionierts. Zusätzliche Frage: Wie bekomme ich einen logarithmischen Grid?

gib mal dein komplettes Beispiel mit Datei an.

Herbert

DaPhil
27-05-2010, 13:07
Die beiden Dateien sind im Anhang. Geht doch nicht wenn ich die Datei anpasse, also nurn och 2 Reihen habe... Die Datei im Anhang ist jetzt schon die veränderte.

voss
27-05-2010, 14:43
Die beiden Dateien sind im Anhang. Geht doch nicht wenn ich die Datei anpasse, also nurn och 2 Reihen habe... Die Datei im Anhang ist jetzt schon die veränderte.

wie willst du denn den logarithmus von 0 bestimmen?? Das muss doch
in die Hose gehen ... und das Logfile gibt dir dazu auch den entsprechenden Hinweis ...


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

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

\begin{document}

\begin{postscript}
\psset{
unit=\linewidth,
xAxisLabelPos={c,-0.9cm},
yAxisLabelPos={-1.2cm,c},
xAxisLabel=$x$,
yAxisLabel=$f(y)$
}
\begin{psgraph}[
axesstyle=frame,
logLines=y,
Dx=2,
dx=2cm,
xlabelFactor=\cdot10^3,
showorigin=true,
linewidth=0.5pt,
ticks=all,
tickstyle=inner,
subticks=10,
ticksize=5pt,
subticksize=0.5,
tickwidth=0.5pt,
linecap=1,
subtickcolor=black,
subtickwidth=0.5pt,
labels=all
](0,0)(9000,5){9cm}{9cm}
\pstScalePoints(1,1){}{ dup 0 gt { log } if }
\readdata{\data}{Daten_Caesium_test.txt}
\listplot[
% plotNoMax=1,
% plotNo=1,
% nStep=10,
plotstyle=line,
dotstyle=*,
dotsize=3pt,
linecolor=black,
linewidth=0.5pt,
showpoints=true
% xEnd=0.5
]{\data}
\end{psgraph}
\end{postscript}


\end{document}

Die Ausgabe ist jetzt getürkt, da für y=0 einfach 0 angenommen wird, obwohl es eigentlich -unendlich sein müsste, wenn du logarithmierst.

Herbert

DaPhil
27-05-2010, 14:49
Kann man die Werte dann auch ganz Rausschmeißen? Und wie bekomme ich einen logarithmischen Grid?

voss
27-05-2010, 15:01
Kann man die Werte dann auch ganz Rausschmeißen? Und wie bekomme ich einen logarithmischen Grid?

Man kann die Werte ignorieren.


\pstScalePoints(1,1){}{ dup 0 gt { log }{pop pop CP} ifelse }
CP steht für currentpoint, wqas dem vorhergehenden geplotteten Punkt entspricht.

in der Doku zu pst-plot sind doch reichlich Beispiele für Achseneinteilungen.


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

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

\begin{document}

\begin{postscript}
\psset{
unit=\linewidth,
xAxisLabelPos={c,-0.9cm},
yAxisLabelPos={-1.2cm,c},
xAxisLabel=$x$,
yAxisLabel=$f(y)$
}
\begin{psgraph}[
axesstyle=frame,
logLines=y,
ylogBase=10,
Dx=2,
dx=2cm,
xlabelFactor=\cdot10^3,
showorigin=true,
linewidth=0.5pt,
ticks=all,
tickstyle=inner,
subticks=10,
ticksize=5pt,
yticksize=0 9cm
ysubticksize=1
xsubticksize=0.5,
tickwidth=0.5pt,
linecap=1,
subtickcolor=black,
subtickwidth=0.5pt,
labels=all
](0,0)(9000,5){9cm}{9cm}
\pstScalePoints(1,1){}{ dup 0 gt { log }{pop pop CP} ifelse }
\readdata[yStart=1]{\data}{Daten_Caesium_test.txt}
\listplot[
% plotNoMax=1,
% plotNo=1,
% nStep=10,
plotstyle=line,
dotstyle=*,
dotsize=3pt,
linecolor=black,
linewidth=0.5pt,
showpoints=true
% xEnd=0.5
]{\data}
\end{psgraph}
\end{postscript}


\end{document}

Herbert

DaPhil
27-05-2010, 15:34
Ich habe mich jetzt nochmal durch das manual gewühlt. Ich sehe zwar dass man die ticks so groß machen kann dass sie praktisch ein grid bilden, ich möchte jedoch gerne die ticks UND ein grid haben, das gepunktet im Hintergrund ist (siehe Anhang). Für ein nicht logarithmischen Plot funktioniert das auch ganz brav. Da kann ich ein grid mit \psgrid einzeichnen. Kann ich hier auch, nur dass die y-Achse nicht logarithmisch ist...

EDIT: Funktioniert doch nicht mit psgrid! Weil hier ab 1000 kein grid mehr in x-Richtung gezeichnet wird... und ich es auch nicht schaffe, z.b. mit \psset{unit=1mm} den "stepsize" für psgrid vorzugeben... mist.

mechanicus
27-05-2010, 16:37
Hi,

dann baue dein eigene Grid:

{\psset{linestyle=dotted}
\multido{\iB=1+1}{4}{
\psline(0,\iB)(9000,\iB)
}
\multido{\iA=2000+2000}{4}{
\psline(\iA,0)(\iA,5)
}
}
Wobei in deinem Fall auch eine Schleife möglich wäre:

\multido{\iA=2000+2000,\iB=1+1}{4}{
\psset{linestyle=dotted}
\psline(0,\iB)(9000,\iB)
\psline(\iA,0)(\iA,5)
}

Gruß
Marco

DaPhil
28-05-2010, 08:18
und ich dachte mit pstricks kann man ALLES machen... leider sieht so ein selbstgebauter grid nicht so schön aus wie der mit psgrid. bei psgrid liegen die punkte genau übereinander, wenn sich 2 gridlinien kreuzen... schade dass es keine möglichkeit gibt, psgrid eine logarithmische einteilung zu spendieren, bzw. in den optionen für psgraph gleich den grid mit vorgeben können...

Karlo
29-05-2010, 00:31
... bei psgrid liegen die punkte genau übereinander, wenn sich 2 gridlinien kreuzen...

Wenn ich mich nicht irre, kann man die Punktabstände durch die Option dotsep einstellen. Du musst sie also nur so anpassen, dass sie genau übereinander liegen oder man könnte auch ne doppelte Schleife basteln die das gesamte Gebiet abwandert und einfach nur Punkte zeichnet.
Keine Ahnung, ob es noch eine direkte Lösung mit psgrid gibt... aber ich sag ma...try it...
achja...ich persönlich frage mich: macht es Sinn ein logarithmisches Gitter drunter zu legen? Nach meinen Geschmack stört das eher das Gesamtbild...

lg
Karlo

voss
31-05-2010, 08:52
und ich dachte mit pstricks kann man ALLES machen... leider sieht so ein selbstgebauter grid nicht so schön aus wie der mit psgrid. bei psgrid liegen die punkte genau übereinander, wenn sich 2 gridlinien kreuzen... schade dass es keine möglichkeit gibt, psgrid eine logarithmische einteilung zu spendieren, bzw. in den optionen für psgraph gleich den grid mit vorgeben können...

sicher geht alles! Man könnte ja einfach mal ausführlich die Doku
studieren -> "texdoc pst-plot" ...

(2,-3)(7,-1.0)
\end{pspicture}

\end{document}
]

Herbert

DaPhil
31-05-2010, 09:23
Hallo,
ich habe jetzt eine passable Lösung für mich gefunden:


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

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

\begin{document}

\begin{postscript}
\psset{
xAxisLabelPos={c,-1.2cm},
yAxisLabelPos={-1.4cm,c},
xAxisLabel=$x$,
yAxisLabel=$f(y)$
}
\begin{psgraph}[
axesstyle=frame,
yLogBase=10,
logLines=y,
Dx=500,
Dy=1,
showorigin=true,
linewidth=0.5pt,
ticks=all,
tickstyle=inner,
ysubticks=10,
xsubticks=5,
ticksize=5pt,
subticksize=0.5,
tickwidth=0.5pt,
linecap=1,
subtickcolor=black,
subtickwidth=0.5pt,
labels=all
](500,0)(3000,5){8cm}{6cm}
\psgrid[
xunit=1.6cm,
yunit=1.2cm,
griddots=20,
subgriddiv=0,
gridlabels=0pt,
gridwidth=0.5pt,
gridcolor=black
](1,0)(6,5)
\end{psgraph}
\end{postscript}

\end{document}

Hier kann man zwar keinen subgrid logarithmisch zeichnen, aber egal... Hier muss allerdings die units und die Längen (hier (1,0)(6,5)) manuell gewählt werden. Diese werden aber doch mit psgraph berechnet. Kann man darauf zugreifen? Sodass man nicht manuell ausrechnen muss?

Gibt es eigentlich eine Möglichkeit, den Entwicklern Vorschläge für Verbesserungen/Wünschenswertes zu machen?

voss
31-05-2010, 13:51
Hier kann man zwar keinen subgrid logarithmisch zeichnen, aber egal... Hier muss allerdings die units und die Längen (hier (1,0)(6,5)) manuell gewählt werden. Diese werden aber doch mit psgraph berechnet. Kann man darauf zugreifen? Sodass man nicht manuell ausrechnen muss?

wie oft soll ich noch sagen, dass es in der Doku steht ...
Dass es gräßlich aussieht, hat dir schon jemand anders gesagt.


\documentclass[12pt,a4paper]{article}

\usepackage{pstricks-add}


\begin{document}

\psset{
xAxisLabelPos={c,-1.2cm},
yAxisLabelPos={-1.4cm,c},
xAxisLabel=$x$,
yAxisLabel=$f(y)$
}
\begin{psgraph}[
axesstyle=frame,
ylogBase=10,
logLines=y,
Dx=500,
Dy=1,
showorigin=true,
linewidth=0.5pt,
ticks=all,
tickstyle=inner,
ysubticks=10,
xsubticks=5,
xticksize=0 6cm,
subticksize=0.5,
tickwidth=0.5pt,
linecap=1,
subtickcolor=black,
subtickwidth=0.5pt,
ticklinestyle=dotted,
subticklinestyle=dotted,
labels=none
](500,0)(3000,5){8cm}{6cm}
\psaxes[
axesstyle=frame,
ylogBase=10,
logLines=y,
Dx=500,
Dy=1,
showorigin=true,
linewidth=0.5pt,
ticks=all,
tickstyle=inner,
ysubticks=10,
xsubticks=5,
ticksize=5pt,
subticksize=0.5,
tickwidth=0.5pt,
linecap=1,
subtickcolor=black,
subtickwidth=0.5pt,
labels=all
](500,0)(3000,5)
\end{psgraph}

\end{document}

Herbert