alt text

Wieso geht eigentlich

Open in Online-Editor
foreach \k in {1,...,5}{
            \addplot+[mark=none, blue] {x^(\k+2) - x^(\k+1) -1} node[above, ]{\k};
}

nicht?

Wenn man irgendeinText statt \k verwendet, geht es. :(

Falsche Eingabe oder ein Bug?

BTW: Hat jemand eine Idee für einen gescheiten Maßstab, so dass die Kurven 'kurviger' werden?

Open in Online-Editor
\documentclass[border=5pt, varwidth]{standalone}
%\documentclass[ngerman]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}
\begin{axis}
[
%title =,
xlabel = $x$,
ylabel = $y$,
samples = 200,
domain = -2:2,
%ymin= -1,
ymax = 10,
ymin=-10,
xmax=2,
axis lines = middle, 
%y=0.2cm,
%x=1cm
]
\foreach \k in {1,...,5}{
        \addplot+[mark=none, blue] {x^(\k+2) - x^(\k+1) -1} ;
        % node[above, ]{\k};
}
\end{axis}
\end{tikzpicture}
\end{document}

gefragt 27 Jun '16, 21:07

cis's gravatar image

cis
9.5k75452491
Akzeptiert-Rate: 29%

bearbeitet 27 Jun '16, 21:14

Vier der fünf \usepackage sind völlig überflüssig für das Beispiel.

(28 Jun '16, 00:17) Henri

Einen Möglichkeit, wie Du die Parameter mit an die Graphen schreiben kannst, findest Du ganz unten. Wie @Henri würde ich das aber nicht empfehlen und statt dessen ebenfalls \pgfplotsinvokeforeach und eine Legende verwenden.

Dafür kannst Du eine cycle list mit unterschiedlichen Linienstilen verwenden, zum Beispiel linestyles mit drei verschiedenen Linienstilen oder linestyles* mit fünf verschiedenen Linienstilen.

alt text

Code:

Open in Online-Editor
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}% compat setzen
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    xlabel=$x$,ylabel=$y$,
    samples=200,domain=-2:2,
    ymin=-10,ymax=10,
    axis lines=middle,
    legend pos=outer north east,
    cycle list name=linestyles*
    ]
    \pgfplotsinvokeforeach{1,...,5}{
      \addplot{x^(#1+2) - x^(#1+1) -1};
      \addlegendentry{$k = #1$};
    }
  \end{axis}
\end{tikzpicture}
\end{document}

Wenn Du Graphen für noch mehr Parameter zeichnen möchtest, kannst Du cycle multi list verwenden. Beispielsweise

Open in Online-Editor
cycle multi list={
  black,gray!80\nextlist
  linestyles*
}

Hier werden die ersten fünf Graphen schwarz mit verschiedenen Linienstilen gezeichnet und die letzten beiden dann grau.

alt text

Code:

Open in Online-Editor
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}% compat setzen
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    xlabel=$x$,ylabel=$y$,
    samples=200,domain=-2:2,
    ymin=-10,ymax=10,
    axis lines=middle,
    legend pos=outer north east,
    cycle multi list={
      black,gray!80\nextlist
      linestyles*
    }
    ]
    \pgfplotsinvokeforeach{1,...,7}{
      \addplot{x^(#1+2) - x^(#1+1) -1};
      \addlegendentry{$k = #1$};
    }
  \end{axis}
\end{tikzpicture}
\end{document}

In dem konkreten Fall könntest Du schon auch \foreach verwenden, musst aber dafür sorgen, dass die Schleifenvariable sofort expandiert wird, da die \addplot Befehle erst ausgewertet werden, wenn die Schleifenvariablen gar nicht mehr gelten. Aber da sind noch eine ganze Reihe anderer Probleme:

  • Mit domain=-2:2 und ymax=10 liegen die "Enden" der Plots teilweise außerhalb des Diagramms und die Nodes werden damit teilweise oder ganz abgeschnitten. Das lässt sich verhindern mit clip=false, allerdings braucht man dann unbedingt auch eine Begrenzung der y-Werte, also restrict y to domain=-10:10. Da die Steigung am "Ende" teils sehr groß ist, liegt der letzte Punkt mitunter unterhalb von y=10, wie unten für k=5 zu sehen ist.
  • Wenn die Graphen am "Ende" nur einen geringen horizontalen Abstand haben, berühren oder überlappen sich die angegebenen Parameter.
  • In Deinem Fall kann man die Nodes überall oberhalb der "Enden" setzen. Wenn ein Teil der Funktionen am "Ende" fällt statt steigt, müsste dieser Teil Nodes unterhalb bekommen.
  • Dadurch, dass die Graphen alle gleich gezeichnet werden, lässt sich für x<0 nicht erkennen, welche Kurve zu welchem Parameter gehört.

alt text

Code:

Open in Online-Editor
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}% compat setzen
\begin{document}
\begin{tikzpicture}
\begin{axis}
[
xlabel = $x$,
ylabel = $y$,
samples = 200,
domain = -2:2,
ymax = 10,
ymin=-10,
xmax=2,
axis lines = middle, 
restrict y to domain=-10:10,% <-
clip=false% <-
]
\foreach \k in {1,...,7}{
  \edef\temp{%
    \noexpand\addplot[] {x^(\k+2) - x^(\k+1) -1}
     node[above]{\k};
  }
  \temp
}
\end{axis}
\end{tikzpicture}
\end{document}
Permanenter link

beantwortet 28 Jun '16, 10:27

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

Das Problem ist, dass \foreach grouping ist, \addplot aber nicht gruppiert sein darf (Warum steht irgendwo im Manual, kann mich aber gerade nicht erinnern). Es gibt zum einen die Alternative \pgfplotsforeachungrouped was die gleiche Syntax wie \foreach hat und \pgfplotsinvokeforeach bei dem man keine Iterationsvariable hat, sondern #1 im Schleifenkörper verwendet. Der Vorteil daran ist, dass es keinerlei Expansion bedarf um den Iteratiosschritt zu bekommen. Daher verwende ich das fast immer.

Statt den Wert von k an die Kurven zu schreiben würde ich sie lieber unterschiedlich einfärben (ich habe einen Gradient von rot nach blau gewählt) und eine Legende machen. Das erspart viele Kopfschmerzen, die eine unterschiedliche Positionierung für jedes verschiedene k mit sich gebracht hätte. Damit das ganze schwarz-weiß-agnostisch bleibt kann man mit cycle list name=linestyles* das Strichmuster der Linien alternieren. Zusätzlich könnte man die Farben im Gradienten auch über eine Cycle List definieren und welche mit hohem Kontrast nehmen; colorbrewer hilft dabei.

Hat jemand eine Idee für einen gescheiten Maßstab, so dass die Kurven 'kurviger' werden?

Keine Ahnung, was hier gemeint ist. Vielleicht sowas? Damit die Kurven glatter werden dreht man einfach samples hoch, aber samples=200 ist schon ziemlich viel. Zusätzlich kann man die geplotteten Punkte statt mit geraden Linien mit Splines verbinden indem man die Option smooth mitgibt.

Open in Online-Editor
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    xlabel=$x$,ylabel=$y$,
    samples=200,domain=-2:2,
    restrict y to domain=-10:10,
    axis lines=middle,
    legend pos=outer north east,
    cycle list name=linestyles*
    ]
    \pgfplotsinvokeforeach{1,...,5}{
      \addplot+[mark=none,blue!\the\numexpr(#1-1)*25\relax!red] {x^(#1+2) - x^(#1+1) -1};
      \addlegendentry{$k = #1$};
    }
  \end{axis}
\end{tikzpicture}
\end{document}

alt text

Permanenter link

beantwortet 28 Jun '16, 00:05

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 28 Jun '16, 23:33

"Statt den Wert von k an die Kurven zu schreiben würde ich sie lieber unterschiedlich einfärben..." - das möchte ich gerade nicht. Bendenke: Etwa bei einem SW-Ausdruck geht die Theorie flöten... ;)

(28 Jun '16, 00:26) cis
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×728
×296

gestellte Frage: 27 Jun '16, 21:07

Frage wurde gesehen: 6,937 Mal

zuletzt geändert: 28 Jun '16, 23:33