Ich möchte die Funktion x*y/(x^2+y^2)^2 plotten, die am Nullpunkt gegen unendlich geht. Daher möchte ich die Werte dort begrenzen, und mache das hier mit restrict z to domain:

Open in writeLaTeX
\documentclass{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{colormaps} 
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      restrict z to domain = -12:12,
      colormap/autumn,
      view/el = 45
    ]
    \addplot3[
      surf,
      samples  =       70,
      domain   = -0.5:0.5,
      domain y = -0.5:0.5,
    ]
    {x*y/(x^2+y^2)^2};
  \end{axis}
\end{tikzpicture}
\end{document}

Jedoch habe ich dann einen gezackten Rand:

Grafik der Funktion

Ich möchte ihn gern gerade abgeschnitten haben, damit es vernünftig aussieht, etwas so (mit Wolfram Alpha):

Plot mit Wolfram Alpha

Ideen, ggf. in Kombination:

  • restrict z to domain*
  • Grenzlinie plotten mit zusätzlichem Plot und etwa restrict expr to domain={rawz}{19.99:20.01}
  • z filter
  • ein dritter Plot (zwischendurch) ohne Grid, mit restrict oder z filter für ein homogenes Plateau
  • ein contour plot für das Plateau
  • die Plateau-Grenze mit z=20 machen durch parametrisierten Plot in x und y, evtl. mit fill

Kam bei den Experimenten noch nix schönes raus.

Wie kriege ich die Ränder gerade und den Plot ansehnlich, ähnlich wie im zweiten Plot?

gefragt 16 Jul '14, 21:33

stefan's gravatar image

stefan ♦♦
18.3k163148
Akzeptiert-Rate: 50%


Das clippen scheint int diesem Beispiel mit restrict z to domain* gut zu klappen.

Zum Zeichnen einer praeziseren Aussenkante kannst Du einen contour plot hinterherschieben, der nur das level 12 hat. Den kannst Du entweder nur zeichnen oder fuellen; hier ist es mit fuellung:

alt text

Open in writeLaTeX
\documentclass{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{colormaps} 
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
      colormap/autumn,
      view/el = 45
    ]
    \addplot3[
      restrict z to domain* = -12:12,
      surf,
      samples  =       70,
      domain   = -0.5:0.5,
      domain y = -0.5:0.5,
    ]
    {x*y/(x^2+y^2)^2};

    % the contour plot handler can *draw* a contour line, but it cannot fill:
    \addplot3[
      contour gnuplot={
        levels={12},
        labels=false,
      },
      samples  =       70,
      domain   = -0.5:0.5,
      domain y = -0.5:0.5,
    ]
    {x*y/(x^2+y^2)^2};

    % now we fill the contour:
    \addplot3[
        % 1000 is always the last entry in the colormap, i.e. point
        % meta max:
        /utils/exec={\pgfplotscolormapdefinemappedcolor{1000}},
        draw=none,
        fill=mapped color] 
        file {P_contourtmp0.table};
  \end{axis}
\end{tikzpicture}
\end{document}

Du kannst auch das fuellen weglassen und contour gnuplot={..., draw color=black} oder so schreiben, dann haettest Du lediglich eine schwarze Umrandung.

Permanenter link

beantwortet 18 Jul '14, 15:02

cfeuersaenger's gravatar image

cfeuersaenger
3.7k23
Akzeptiert-Rate: 34%

@cfeuersaenger Hervorragend, vielen Dank! Hab das gleich als Anlass zu einem Blogpost genommen: 3D-Plots beschneiden.

(19 Jul '14, 13:55) stefan ♦♦
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:

×730
×298
×28
×20

gestellte Frage: 16 Jul '14, 21:33

Frage wurde gesehen: 15,018 Mal

zuletzt geändert: 19 Jul '14, 13:55