Wie färbt man den Bereich unter einer Kurve mithilfe der Tikz-Datenvisualisierung?

Wie färbt man den Bereich unter einer Kurve mithilfe der Tikz-Datenvisualisierung?

Normalerweise verwende ich zum Kurvenzeichnen einfaches Tikz. Ich benötige Koordinatensysteme im „Schulbuchstil“ mit einem 50-mm-Raster.

Ich habe versucht, die Datenvisualisierungsbibliothek Tikz zu verwenden.

\documentclass{article}
\usepackage{tikz,pgfplots}
\usetikzlibrary{datavisualization}
\usetikzlibrary{datavisualization.formats.functions}

\pagestyle{empty}
\begin{document}

\begin{tikzpicture}[]
\datavisualization [ 
      school book axes={unit=0.5},
      visualize as smooth line, 
      x axis={label={$x$},grid,grid={minor steps between steps=1}}, 
      y axis={label={$y$},grid,grid={minor steps between steps=1}},
      every major grid/.style = {style={gray, thin}},
      every minor grid/.style = {style={gray, very thin}}
]

data [format=function] { 
  var x : interval [-2:2]; 
  func y = 1/2*(\value x)^2; 
}
info' {
   \fill[fill=lightgray] (visualization cs: x=1, y=0) -- plot [domain=1:2] (visualization cs: x=\x,y={0.5*(\x)^2}) -- (visualization cs: x=2, y=0) --cycle;
}
;
\end{tikzpicture}

\end{document}

Das einzige, was ich nicht richtig hinbekommen habe, ist das Einfärben des Bereichs unter einer Kurve. Ich habe im Infoblock Folgendes versucht:

\fill[fill=lightgray] (visualization cs: x=1, y=0) -- plot [domain=1:2] (visualization cs: x=\x,y={0.5*(\x)^2}) -- (visualization cs: x=2, y=0) --cycle;

Dies führt jedoch zu einem PGF-Mathematikfehler. Paket-PGF-Mathematikfehler: Eingabe „0,5*(1)^2“ konnte nicht analysiert werden.

Ich glaube, ich brauche eine Möglichkeit, dem Plot-Befehl mitzuteilen, dass er die Visualisierungs-CS verwenden soll.

Dank im Voraus.

Prost

Antwort1

Es ist besser, einen neuen Visualizer zu erstellen, der sich von unterscheidet visualize as line. Also kopiere ich die Definition des letzteren von tikzlibrarydatavisualization.code.tex. Der einzige Unterschied besteht darin, dass

every path/.style={draw},

wird geändert in

every path/.style={draw,fill},

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{datavisualization,datavisualization.formats.functions}

\begin{document}

\makeatletter
\tikzdatavisualizationset{
  visualize as pie/.style={
    new object={
      when=after survey,
      store=/tikz/data visualization/visualizers/#1,
      class=plot handler visualizer,
      arg1=#1,
      arg2={\tikz@dv@plot@handler,\tikz@dv@plot@mark@maker}
    },
    new visualizer={#1}{%
      every path/.style={draw,fill},
      style={every mark/.append style={color=visualizer color}},
      mark size=2pt,
      semithick,
      color=visualizer color,
      mark=none,
      /tikz/data visualization/every visualize as line/.try,
    }{visualizer in legend=\tikz@dv@legend@entry@as@example},
    #1={straight line}
  },
  visualize as pie/.default=pie,
}

\begin{tikzpicture}
    \datavisualization[
        school book axes={unit=0.5},
        x axis={label={$x$},grid,grid={minor steps between steps=1}}, 
        y axis={label={$y$},grid,grid={minor steps between steps=1}},
        every major grid/.style={style={gray,thin}},
        every minor grid/.style={style={gray,very thin}},
        visualize as pie
    ]
        data point[x=-2, y=0]
        data[format=function]{var x :interval [-2:2];func y =1/2*(\value x)^2;}
        data point[x=2, y=0];
\end{tikzpicture}

\end{document}

Antwort2

Nicht direkt mithilfe der Visualisierung, sondern pgfplotsmithilfe der dazugehörigen fillbetweenBibliothek. Das sieht einfach aus.

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\usetikzlibrary{fillbetween}

\pagestyle{empty}
\begin{document}

\begin{tikzpicture}[]
  \begin{axis}[
    grid=both,
    ymin=0,
    xmin=-3,xmax=3,
    axis on top
    ]
    \addplot[draw=none,name path=A,domain=-2:2,fill=olive!40] {1/2*(x)^2}\closedcycle;
    \addplot[solid,thick,red,domain=-2:2] {1/2*(x)^2};
  \end{axis}
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Ich habe zuerst den Bereich ausgefüllt und dann die Kurve gezeichnet, um die Linien um die Füllung herum zu vermeiden. In diesem Fall hilft es auch, die Achse oben axis on topzu halten .x

Antwort3

Mithilfe der Koordinatenberechnung ( \usetikzlibrary{calc}) kann man eine Koordinatentransformation durchführen. Leider habe ich nur diese Art von unübersichtlicher Transformation gefunden, vielleicht kann jemand eine sauberere Methode dafür posten.

info' {
  \begin{scope}[shift={(visualization cs:x=0, y=0)},
     x={($(visualization cs:x=1, y=0)-(visualization cs:x=0, y=0)$)},
     y={($(visualization cs:x=0, y=1)-(visualization cs:x=0, y=0)$)}]
    \fill[fill=lightgray] (1,0) -- plot [domain=1:2] (\x,{0.5*(\x)^2}) -- (2, 0) --cycle;
  \end{scope}
}

verwandte Informationen