Auch hier gefragt: https://tex.stackexchange.com/questions/526402/pgfplots-how-to-use-different-layers-correctly-at-fillbetween


Ich möchte - mit pgfplots - ein Ringdiagramm erstellen:

enter image description here

Wie muss ich die fill between's richtig anwenden?
Mit verschiedenen layers?

Der entscheidende Teil ist:

% Fill
\noexpand\addplot[\Color] fill between [of=li and lo];
\noexpand\addplot[\Color] fill between [of=li and ui];%
\noexpand\addplot[\Color] fill between [of=lo and uo];
\noexpand\addplot[\Color] fill between [of=ui and uo];
% , on layer= main
% , on layer=axis background

Hinweis: Ich suche hier nach einer pgfplots-Lösung, Plain-TikZ-Lösungen stehen hier https://tex.stackexchange.com/a/59544

enter image description here

\documentclass[border=5pt, tikz]{standalone}
\usepackage{amsmath, amssymb}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{fillbetween}
\usetikzlibrary{calc}

% Input
\pgfmathsetmacro\r{5}
\pgfmathsetmacro\R{\r+3}
\pgfmathsetmacro\h{2}
\pgfmathsetmacro\Start{0}
\pgfmathsetmacro\End{0*-10}
%
\pgfplotstableread{
Percent   Color                      Text
21           red                         1
27           cyan                       2
6            green!80!black         3
46          brown                      4
}\tabledata

\pgfplotstablegetrowsof{\tabledata}
\pgfmathsetmacro\RowNoMax{\pgfplotsretval-1}

\begin{document}
\begin{tikzpicture}[every path/.style={thick},]

\begin{axis}[title=Actual, 
clip=false,
axis lines=middle, axis equal, hide axis, 
y dir=reverse,
samples y=0,
]
\pgfplotsinvokeforeach{0,...,\RowNoMax}{%
\pgfplotstablegetelem{#1}{Percent}\of{\tabledata}
\pgfmathsetmacro\Percent{\pgfplotsretval}
\pgfplotstablegetelem{#1}{Color}\of{\tabledata}
\pgfmathsetmacro\Color{"\pgfplotsretval"}
\pgfplotstablegetelem{#1}{Text}\of{\tabledata}
\pgfmathsetmacro\Text{"\pgfplotsretval"}
% 
\pgfmathsetmacro\Start{\End}
\pgfmathsetmacro\End{\Start+\Percent*3.6}
\edef\temp{%
%% Draw
\noexpand\addplot3[name path=li, domain=\Start:\End]({\r*sin(x)}, {\r*cos(x)}, {0})  coordinate[pos=0](liStart) coordinate[](liEnd);
\noexpand\addplot3[name path=lo, domain=\Start:\End, fill=none]({\R*sin(x)}, {\R*cos(x)}, {0}) coordinate[pos=0](loStart) coordinate[](loEnd);
%
\noexpand\addplot3[name path=ui, domain=\Start:\End]({\r*sin(x)}, {\r*cos(x)}, {\h}) coordinate[pos=0](uiStart) coordinate[](uiEnd) coordinate[pos=0.5](uiMid);
\noexpand\addplot3[name path=uo, domain=\Start:\End]({\R*sin(x)}, {\R*cos(x)}, {\h}) coordinate[pos=0](uoStart) coordinate[](uoEnd) coordinate[pos=0.5](uoMid);
%
\noexpand\draw[fill=none, on layer= axis foreground] (liStart) -- (loStart)  --  (uoStart) -- (uiStart) --cycle;
\noexpand\draw[fill=none] (liEnd) -- (loEnd)  --  (uoEnd) -- (uiEnd) --cycle;
% Fill
\noexpand\addplot[\Color] fill between [of=li and lo];
\noexpand\addplot[\Color] fill between [of=li and ui];%
\noexpand\addplot[\Color] fill between [of=lo and uo];
\noexpand\addplot[\Color] fill between [of=ui and uo];
% , on layer= main
% , on layer=axis background
}\temp}%

\end{axis}
\end{tikzpicture}
\end{document}

gefragt 31 Jan '20, 16:48

cis's gravatar image

cis
9.5k78452491
Akzeptiert-Rate: 29%

Mein Rat: Gar nicht, Projektionen dreidimensionaler Torten- oder Ringdiagramme führen zu einer Verzerrung der Daten und nicht zu deren guter Erfassbarkeit. Im pgfmanual gibt es hierzu einen sehr aufschlussreichen Absatz ab Seite 99.

(31 Jan '20, 16:53) Skillmon

@Skillmon Mich interessiert das allein aus theoretischen Gründen, wie man das richtig füllt. Scheinbar ist es trivial nicht möglich, aber ich kenne fillbetween auch nicht so gut.
Ansonsten wollte ich zu den verlinkten Plain-TikZ-Umsetzungen eine einfache Tabellenlösung erstellen; davon habe ich alles bewältigt, bis auf die Füllungen. :(

(31 Jan '20, 17:58) cis
Deine Antwort auf die Frage: (Bemerkungen bitte oben als Kommentar)
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:

×296
×1

gestellte Frage: 31 Jan '20, 16:48

Frage wurde gesehen: 2,313 Mal

zuletzt geändert: 31 Jan '20, 17:58