PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : nochmals \psgrid



DaPhil
19-02-2011, 08:59
Hallo (Herbert),
ich habe immer noch das Problem, dass bei der \begin{psgraph} Umgebung das grid, das ich innerhalb erzeuge, über die Achsen gemalt wird anstatt darunter. Ich habe deinen Code ausprobiert, mache aber offensichtlich noch einen Fehler, da kein grid gezeichnet wird.


\documentclass[12pt,a4paper]{article}
\usepackage[applemac]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{graphicx}
\usepackage{pst-all}
\usepackage{pstricks-add}
\usepackage{pst-lens}
\usepackage{auto-pst-pdf}

\usepackage{pst-plot}
\makeatletter
\def\psgraph@v(#1,#2)(#3,#4)(#5,#6)#7#8{% with special origin
% Xorig | yorig | minX | minY | maxX | maxY | Length x-axis | length y-axis%
\pst@killglue%
\begingroup%
\pstFPsub\pst@tempA{#5}{#3}%
\pst@dimm=#7%
\pst@dimo=\pst@tempA pt%
\pstFPdiv\pst@@dx{\strip@pt\pst@dimm}\pst@tempA%
\pst@xunit=\pst@@dx\p@%
%
\ifx!#8\let\pst@yunit=\pst@xunit\else
\pst@dimm=#8%
\pstFPsub\pst@tempA{#6}{#4}%
\pstFPdiv\pst@@dy{\strip@pt\pst@dimm}\pst@tempA%
\pst@yunit=\pst@@dy\p@%
\fi%
%
\pst@dima=#3\pst@xunit \advance\pst@dima by \psk@llx%
\pst@dimb=#4\pst@yunit \advance\pst@dimb by \psk@lly%
\pst@dimc=#5\pst@xunit \advance\pst@dimc by \psk@urx%
\pst@dimd=#6\pst@yunit \advance\pst@dimd by \psk@ury%
\if@star\pspicture*(\pst@dima,\pst@dimb)(\pst@dimc ,\pst@dimd)\else%
\pspicture(\pst@dima,\pst@dimb)(\pst@dimc,\pst@dim d)\fi%
\psset[pstricks]{xunit=\pst@xunit,yunit=\pst@yunit}
\ifdim\pst@xunit=\pst@yunit \psset[pstricks]{runit=\pst@xunit}\fi%
\psgrid[...](...)(...)% <---- Hier habe ich mein grid eingefügt
\bgroup%
\use@par%
\psaxes(#1,#2)(#3,#4)(#5,#6)%
\egroup%
\psgraph@vi(#1,#2)(#3,#4)(#5,#6)
}

\makeatother

\begin{document}
...

Kannst du mir da noch einmal helfen? Das würde mir sehr helfen.

voss
19-02-2011, 09:24
ich habe immer noch das Problem, dass bei der \begin{psgraph} Umgebung das grid, das ich innerhalb erzeuge, über die Achsen gemalt wird anstatt darunter. Ich habe deinen Code ausprobiert, mache aber offensichtlich noch einen Fehler, da kein grid gezeichnet wird.


Ergänze mal das Beipiel zu einem kompletten, also die psgraph-Umgebung ergänzen.
Ich sehe es mir dann morgen an.

Herbert

DaPhil
19-02-2011, 09:31
Wow Super, Danke!


\documentclass[12pt,a4paper]{article}
\usepackage[applemac]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{graphicx}
\usepackage{pst-all}
\usepackage{pstricks-add}
\usepackage{pst-lens}
\usepackage{auto-pst-pdf}

\usepackage{pst-plot}
\makeatletter
\def\psgraph@v(#1,#2)(#3,#4)(#5,#6)#7#8{% with special origin
% Xorig | yorig | minX | minY | maxX | maxY | Length x-axis | length y-axis%
\pst@killglue%
\begingroup%
\pstFPsub\pst@tempA{#5}{#3}%
\pst@dimm=#7%
\pst@dimo=\pst@tempA pt%
\pstFPdiv\pst@@dx{\strip@pt\pst@dimm}\pst@tempA%
\pst@xunit=\pst@@dx\p@%
%
\ifx!#8\let\pst@yunit=\pst@xunit\else
\pst@dimm=#8%
\pstFPsub\pst@tempA{#6}{#4}%
\pstFPdiv\pst@@dy{\strip@pt\pst@dimm}\pst@tempA%
\pst@yunit=\pst@@dy\p@%
\fi%
%
\pst@dima=#3\pst@xunit \advance\pst@dima by \psk@llx%
\pst@dimb=#4\pst@yunit \advance\pst@dimb by \psk@lly%
\pst@dimc=#5\pst@xunit \advance\pst@dimc by \psk@urx%
\pst@dimd=#6\pst@yunit \advance\pst@dimd by \psk@ury%
\if@star\pspicture*(\pst@dima,\pst@dimb)(\pst@dimc ,\pst@dimd)\else%
\pspicture(\pst@dima,\pst@dimb)(\pst@dimc,\pst@dim d)\fi%
\psset[pstricks]{xunit=\pst@xunit,yunit=\pst@yunit}
\ifdim\pst@xunit=\pst@yunit \psset[pstricks]{runit=\pst@xunit}\fi%
\psgrid[xunit=\myxunit cm,yunit=\myyunit cm,griddots=20,subgriddiv=0,gridlabels=0pt,gridwid th=0.5pt,gridcolor=red](\gridxmin,\gridymin)(\gridxmax,\gridymax)%
\bgroup%
\use@par%
\psaxes(#1,#2)(#3,#4)(#5,#6)%
\egroup%
\psgraph@vi(#1,#2)(#3,#4)(#5,#6)
}

\makeatother

\begin{document}

\begin{postscript}
\def\xlength{10}
\def\ylength{8}

\def\xmin{220}
\def\xmax{330}
\def\ymin{0}
\def\ymax{3}

\def\myDx{20}
\def\myDy{1}

\pstFPsub\myxunit{\xmax}{\xmin}
\pstFPdiv\myxunit{\xlength}{\myxunit}
\pstFPmul\myxunit{\myxunit}{\myDx}
\pstFPsub\myyunit{\ymax}{\ymin}
\pstFPdiv\myyunit{\ylength}{\myyunit}
\pstFPmul\myyunit{\myyunit}{\myDy}
\pstFPdiv\gridxmin{\xmin}{\myDx}
\pstFPdiv\gridxmax{\xmax}{\myDx}
\pstFPdiv\gridymin{\ymin}{\myDy}
\pstFPdiv\gridymax{\ymax}{\myDy}

\psset{
xAxisLabelPos={c,-0.9cm},
yAxisLabelPos={-1.2cm,c},
xAxisLabel=Wellenlänge/nm,
yAxisLabel=Absorption/arb. units
}

\pslegend[lt](10,10){
~~\psline[linecolor=black](-2,0.04)(2,0.04)~~&\scriptsize{dsDNA} \\
~~\psline[linecolor=black,linestyle=dashed](-2,0.04)(2,0.04)~~&\scriptsize{ssDNA}
}

\begin{psgraph}[
axesstyle=frame,
comma=true,
%ylogBase=10,
%logLines=y,
Dx=\myDx,
Dy=\myDy,
Ox=\xmin,
Oy=\ymin,
showorigin=true,
linewidth=1pt,
ticks=all,
tickstyle=inner,
ysubticks=5,
xsubticks=2,
xticksize=5pt,
% xticklinestyle=dotted,
yticksize=5pt,
subticksize=0.5,
tickwidth=1pt,
linecap=1,
linejoin=0,
subtickcolor=black,
subtickwidth=1pt,
labels=all
](\xmin,\ymin)(\xmax,\ymax){\xlength cm}{\ylength cm}%

\end{psgraph}
\end{postscript}
\end{document}

DaPhil
20-02-2011, 09:03
Hallo Herbert,
ich habe einen (aufwendigeren) workaround gefunden - bei dem mir aber neue Fragen gekommen sind.
Ich möchte eine einzelne x-Achse setzen, die Labels sollen oben sein:


\documentclass[12pt,a4paper]{article}
\usepackage[applemac]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{graphicx}
\usepackage{pst-all}
\usepackage{auto-pst-pdf}
\usepackage{pst-plot}

\begin{document}

\begin{postscript}
\def\pshlabel#1{\normalsize \colorbox{white}{#1}}
\def\psvlabel#1{\normalsize \colorbox{white}{#1}}

\psset{
xAxisLabelPos={c,-0.9cm},
yAxisLabelPos={-1cm,c},
xAxisLabel=Wellenlänge $\lambda$/nm,
yAxisLabel=Absorption $\alpha$/w. E.
}

\begin{psgraph}[
axesstyle=axes,
yAxis=false,
xAxis=false,
ticks=none,
tickstyle=none,
labels=none
](220,0)(330,35){10 cm}{8 cm}%

\psaxes[
axesstyle=axes,
comma=true,
yAxis=false,
% ylogBase=10,
% logLines=y,
Dx=20,
Ox=220,
showorigin=true,
linestyle=1pt,
ticks=all,
tickstyle=inner,
xsubticks=5,
xticksize=5pt,
subticksize=0.5,
tickwidth=1pt,
linecap=1,
subtickcolor=black,
subtickwidth=1pt,
labels=x
](220,0)(330,35)

\psaxes[
axesstyle=axes,
comma=true,
yAxis=false,
% ylogBase=10,
% logLines=y,
Dx=20,
Ox=220,
showorigin=true,
linestyle=1pt,
ticks=all,
tickstyle=inner,
xsubticks=5,
xticksize=-5pt,
subticksize=0.5,
tickwidth=1pt,
linecap=1,
subtickcolor=black,
subtickwidth=1pt,
labels=x,
xlabelPos=top,
](220,35)(330,0)

\end{psgraph}
\end{postscript}
\end{document}

Hierbei werden die Labels aber auf die x-Achse gezeichnet. Schön wäre hier, wenn es derselbe Abstand zur Achse wäre, wie bei xlabelPos=bottom. Im Manual zu pst-plot sieht es auch so aus, bei mir leider nicht.

Möchte man eine weitere x-Achse hinzufügen, möchte man diese auch beschriften. Mit xAxisLabel geht das nicht mehr, wenn man schon für die erste Achse die Labels und Positionen gesetzt hat. Wie setzte ich das Label mit genau gleichem Abstand zur oberen x-Achse in die Mitte? Am besten wäre es, man könnte xAxisLabel und xAxisLabelPos in der \psaxes-/\begin{psgraph}-Umgebung verwenden. Dann könnte man es für jede Achse einzeln setzen.

Weitere Frage: Kommt man um multido herum, wenn man eine z.B. x-Achse mit ticks setzen möchte, die ticks aber nicht bei einem major tick anfangen? Gibt es also so etwas wie ein offset parameter, der die ticks und labels verschiebt? Bsp.: man möchte auf die x-Achse in 20er Schritten die majorticks haben und bei 290 starten. der erste major tick soll aber erst bei 300 kommen, dann bei 320,...

Edit: Bei einer zweiten y-Achse funktioniert das mit yLabelPos=right! Da stimmen die Abstände!

voss
20-02-2011, 12:31
ich habe einen (aufwendigeren) workaround gefunden - bei dem mir aber neue Fragen gekommen sind.


mit den Versionen von pstricks.tex und pst-plot.tex von
http://texnik.dante.de/tex/generic/
kannst du bei den Parametern von psgraph folgendes angeben:

grid,
gridpara={xunit=0.9091cm,yunit=\myyunit cm,
griddots=20,subgriddiv=0,gridlabels=0pt,gridwidth= 0.5pt,
gridcolor=blue},
gridcoor={(11,3)}


dann gibt das in deinem Fall die folgende Ausgabe
http://voss.homedns.org/zzzz2.png

Herbert

DaPhil
20-02-2011, 22:36
Danke vielmals Herbert,
kannst du mir auch etwas zu meinen anderen Fragen sagen? Wie man die ticks setzt, wenn der erste tick kein major tick ist? Gibt es eine Möglichkeit, ein Label für eine zweite x-Achse so zu setzen, dass es dem der ersten (via xAxisLabel und xAxisLabelPos) entspricht? Taucht das Problem mit xlabelPos=bottom nur bei mir auf?

voss
21-02-2011, 08:03
kannst du mir auch etwas zu meinen anderen Fragen sagen? Wie man die ticks setzt, wenn der erste tick kein major tick ist? Gibt es eine Möglichkeit, ein Label für eine zweite x-Achse so zu setzen, dass es dem der ersten (via xAxisLabel und xAxisLabelPos) entspricht? Taucht das Problem mit xlabelPos=bottom nur bei mir auf?

Da sind erst einmal mehrere Fehler drin, tickstyle=1pt geht nicht. Und
ich verstehe nicht, wieso du zwei Label setzen willst.

Herbert

DaPhil
21-02-2011, 09:40
Beispiel: Ich möchte auf der unteren x-Achse die Wellenlänge in nm. Auf der oberen x-Achse soll die Energie in eV. Dann möchte oben auch ein Label haben dass mir das ausweist.

voss
21-02-2011, 20:03
Beispiel: Ich möchte auf der unteren x-Achse die Wellenlänge in nm. Auf der oberen x-Achse soll die Energie in eV. Dann möchte oben auch ein Label haben dass mir das ausweist.

mach einfach:


\psaxes[
xlabelPos=top,
labelsep=7pt,
yAxis=false,
Dx=20,
Ox=220,
showorigin=true,
xsubticks=10,
xticksize=0 -5pt,
subticksize=0.5,
subtickcolor=black,
](220,3)(330,3)
\uput{20pt}[90](275,3){Energie in eV}


Herbert

DaPhil
22-02-2011, 09:52
Warum kann man bei \uput labelsep nicht negativ setzen? Und ein Offset für die ticks und labels einer Achse sind nicht möglich, um nicht bei einem major tick starten zu müssen?

voss
22-02-2011, 18:08
Warum kann man bei \uput labelsep nicht negativ setzen? Und ein Offset für die ticks und labels einer Achse sind nicht möglich, um nicht bei einem major tick starten zu müssen?

Wozu denn ein Offset für die Ticks?
Bei \uput reicht [-90] wenn es negativ sein soll.

Herbert

DaPhil
22-02-2011, 19:10
Die zweite x-Achse startet nicht mit einem großen Tick. Der kommt erst später. Siehe Anhang.

voss
22-02-2011, 19:36
Die zweite x-Achse startet nicht mit einem großen Tick. Der kommt erst später. Siehe Anhang.

wie sollte sie denn auch, wenn das ein subtick ist???

Herbert

DaPhil
22-02-2011, 20:01
Die Achse SOLL ja mit einem subtick starten! Bzw., je nachdem wie der Zusammenhang zwischen 1. und 2. Achse ist, auch zwischen zwei subticks. Ich denk es ist am besten ich bastele mir eine eigene Achse.