
Ich suche nicht genau das oben Gesagte, sondern eine Verallgemeinerung davon.
Ich möchte einen einfachen Plot für eine Arbeit erstellen.
Es sollte sich um eine Vektorgrafik handeln, die einfach zu erstellen ist.
Ich möchte, wenn möglich, Text innerhalb der Komponenten hinzufügen.
Hier gibt es mindestens zwei Möglichkeiten (siehe unten). Es wäre vielleicht auch möglich, dies als eine Art „Wirbel“ auszudrücken, wenn Sie wissen, was ich meine ...
Toll wäre es auch, wenn ich die Überschneidungen der Komponenten hervorheben könnte, etwa durch ein explodierendes Kreisdiagramm mit Überschneidungen.
Antwort1
Ich schätze, das könnte man alsringförmiger Graph, ähnlich wie kreisförmige Stammbaumdiagramme, aus denen dieses Projekt hervorgegangen ist. Damit sollten Sie loslegen können. Die umschließende Umgebung ist onion
und benötigt ein Argument, die Dicke der Ringe (der Stern bewirkt, dass xy-Achsen gezeichnet werden). Das \annulus
Makro benötigt drei obligatorische Argumente: die Ebenennummer (die innerste ist 0), den Startwinkel und den Endwinkel, wobei die Winkel gegen den Uhrzeigersinn angegeben werden. Es gibt auch ein optionales Argument am Anfang für eine Füllfarbe und am Ende für Text. Ein vollständiger Befehl könnte folgendermaßen aussehen:
\annulus[purple!20]{2}{165}{325}[more\\stuff]
(siehe Code unten).
Nichts sehr kompliziertes hier. Die TikDie Z- arc
Funktion erledigt den Großteil der Arbeit.
\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}
%% |=====8><-----| %%
\newlength{\layerwd}
\newcounter{outermost}
%% |=====8><-----| %%
\NewDocumentEnvironment{onion}{sm}{%*= draw axes; #1: thickness of each annulus
\begin{tikzpicture}
\setlength{\layerwd}{#2}%
\setcounter{outermost}{0}
\IfBooleanT{#1}{%
\draw[<->] (-4,0) -- (4,0);
\draw[<->] (0,4) -- (0,-4);
}
}{%
\foreach \A in {0,...,\theoutermost}{\draw[thick] (0,0) circle (\A*\layerwd+\layerwd);}
\end{tikzpicture}
}
% *=unused; [optional fill color]; #3 layer; #4 start angle; #5 stop angle; #6 [optional text]
%% angles are counterclockwise in degrees
\NewDocumentCommand{\annulus}{sO{lightgray}mmmo}{%
\filldraw[thick,fill=#2] (#4:#3*\layerwd) %% start here
arc [radius=#3*\layerwd, start angle=#4, delta angle=#5-#4] %% inner arc
-- (#5:#3*\layerwd+\layerwd) %% move out
arc [radius=#3*\layerwd+\layerwd, start angle=#5, delta angle=#4-#5] %% outer arc
-- cycle; %% Back to the beginnning
\pgfmathsetmacro{\tmp}{(#5-#4)/2 +#4} %% Locate the middle of the arc
\IfNoValueF{#6}{\node[inner sep=0pt, %%% If there is text, print it
text width=#3*\layerwd*3+\layerwd,
align=center,
rotate=\tmp-90,
font=\footnotesize] at (\tmp:#3*\layerwd+0.5*\layerwd)
{#6}; %% Options text, rotated, in the middle of the arc
}%
\ifnum\theoutermost<#3\setcounter{outermost}{#3}\fi
}
%% |=====8><-----| %%
\begin{document}
\begin{onion}*{0.25in}
\annulus{0}{0}{90}[1]
\annulus{0}{90}{180}[2]
\annulus{0}{180}{270}[3]
\annulus{0}{270}{360}[4]
\annulus[yellow]{1}{0}{120}[Y]
\annulus[red!20]{4}{0}{90}
\annulus[blue!30]{3}{60}{180}
\annulus[cyan!20]{2}{45}{130}
\annulus[purple!20]{2}{165}{325}[more\\stuff]
\end{onion}
\end{document}
Aktualisieren
Es schien seltsam, ein ringförmiges Diagramm zu erstellen und die Vorteile von Ti nicht zu nutzenkZs Fähigkeit, Text auf einem Pfad zu platzieren. Die einzige Änderung besteht darin, dass das \annulus
Makro optional sein kann, *
um den optionalen Text auf einem kreisförmigen Pfad zu platzieren. Beachten Sie, dass der Text auf einem Pfad keine Zeilenumbrüche haben darf; \\
dies würde dazu führen, dass TeX hängen bleibt – ich habe mich in begrenztem Umfang gegen diese Möglichkeit abgesichert.
\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}
\usetikzlibrary{decorations, decorations.text}
%% |=====8><-----| %%
\newlength{\layerwd}
\newcounter{outermost}
%% |=====8><-----| %%
\NewDocumentEnvironment{onion}{sm}{%*= draw axes; #1: thickness of each annulus
\begin{tikzpicture}
\setlength{\layerwd}{#2}%
\setcounter{outermost}{0}
\IfBooleanT{#1}{%
\draw[<->] (-4,0) -- (4,0);
\draw[<->] (0,4) -- (0,-4);
}
}{%
\foreach \A in {0,...,\theoutermost}{\draw[thick] (0,0) circle (\A*\layerwd+\layerwd);}
\end{tikzpicture}
}
% *=text on a circular path; [optional fill color]; #3 layer;
% #4 start angle; #5 stop angle; #6 [optional text]
%% angles are counterclockwise in degrees
\NewDocumentCommand{\annulus}{sO{lightgray}mmmo}{%
\filldraw[thick,fill=#2] (#4:#3*\layerwd) %% start here
arc [radius=#3*\layerwd, start angle=#4, delta angle=#5-#4] %% inner arc
-- (#5:#3*\layerwd+\layerwd) %% move out
arc [radius=#3*\layerwd+\layerwd, start angle=#5, delta angle=#4-#5] %% outer arc
-- cycle; %% Back to the beginnning
\pgfmathsetmacro{\tmp}{(#5-#4)/2 +#4} %% Locate the middle of the arc
\IfNoValueF{#6}{%
\IfBooleanTF{#1}
{%
\begingroup
\def\\{\space} %% A safety precaution, \\ = space on decorated text
\path[rotate=\tmp-180,postaction={
decorate,
decoration={
text along path,
raise=-3pt,
text align={align=center},
reverse path=true,
text=#6
}
}] (0,0) circle (#3*\layerwd+0.5*\layerwd);
\endgroup
}%%
{%
\node[inner sep=0pt, %%% If there is text, print it
text width=#3*\layerwd*3+\layerwd,
align=center,
rotate=\tmp-90,
font=\footnotesize] at (\tmp:#3*\layerwd+0.5*\layerwd)
{#6};
}%
}%
\ifnum\theoutermost<#3\setcounter{outermost}{#3}\fi
}
%% |=====8><-----| %%
\begin{document}
\begin{onion}*{0.25in}
\annulus{0}{0}{90}[1]
\annulus{0}{90}{180}[2]
\annulus{0}{180}{270}[3]
\annulus{0}{270}{360}[4]
\annulus*[yellow]{1}{0}{120}[Y is yellow]
\annulus*[red!20]{4}{0}{90}[This is a bunch of bla bla]
\annulus*[blue!30]{3}{60}{180}[This is some longer text]
\annulus[cyan!20]{2}{45}{130}
\annulus[purple!20]{2}{165}{325}[more\\stuff]
\end{onion}
\end{document}
Aktualisierung 2
Es wurde eine kleine Änderung vorgenommen, die sicherstellt, dass der Text in der unteren Hälfte des Diagramms richtig herum steht.
\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}
\usetikzlibrary{decorations, decorations.text}
%% |=====8><-----| %%
\newlength{\layerwd}
\newcounter{outermost}
%% |=====8><-----| %%
\NewDocumentEnvironment{onion}{sm}{%*= draw axes; #1: thickness of each annulus
\begin{tikzpicture}
\setlength{\layerwd}{#2}%
\setcounter{outermost}{0}
\IfBooleanT{#1}{%
\draw[<->] (-4,0) -- (4,0);
\draw[<->] (0,4) -- (0,-4);
}%
}{%
\foreach \A in {0,...,\theoutermost}{\draw[thick] (0,0) circle (\A*\layerwd+\layerwd);}
\end{tikzpicture}
}
% *=text on a circular path; [optional fill color]; #3 layer;
% #4 start angle; #5 stop angle; #6 [optional text]
%% angles are counterclockwise in degrees
\NewDocumentCommand{\annulus}{sO{lightgray}mmmo}{%
\filldraw[thick,fill=#2] (#4:#3*\layerwd) %% start here
arc [radius=#3*\layerwd, start angle=#4, delta angle=#5-#4] %% inner arc
-- (#5:#3*\layerwd+\layerwd) %% move out
arc [radius=#3*\layerwd+\layerwd, start angle=#5, delta angle=#4-#5] %% outer arc
-- cycle; %% Back to the beginnning
\pgfmathsetmacro{\tmp}{(#5-#4)/2 +#4} %% Locate the middle of the arc
\IfNoValueF{#6}{%
\IfBooleanTF{#1}
{%
\begingroup
%% text is always rightside-up:
\pgfmathsetmacro{\rpTF}{ifthenelse(\tmp>180,"false","true")}
\def\\{\space} %% A safety precaution, \\ = space on decorated text
\path[rotate=\tmp-180,postaction={
decorate,
decoration={
text along path,
raise=-3pt,
text align={align=center},
reverse path=\rpTF,
text=#6
}
}] (0,0) circle (#3*\layerwd+0.5*\layerwd);
\endgroup
}%%
{%
\pgfmathsetmacro{\rpTF}{ifthenelse(\tmp>180,\tmp+90,\tmp-90)}
\node[inner sep=0pt, %%% If there is text, print it
text width=#3*\layerwd*3+\layerwd,
align=center,
rotate=\rpTF,
font=\footnotesize] at (\tmp:#3*\layerwd+0.5*\layerwd)
{#6};
}%
}%
\ifnum\theoutermost<#3\setcounter{outermost}{#3}\fi
}
%% |=====8><-----| %%
\begin{document}
\begin{onion}*{0.3in}
\annulus{0}{0}{90}[1]
\annulus{0}{90}{180}[2]
\annulus{0}{180}{270}[3]
\annulus{0}{270}{360}[4]
\annulus*[yellow]{1}{0}{120}[Y is yellow]
\annulus*[red!20]{4}{0}{135}[This is a bunch of bla bla]
\annulus*[blue!30]{3}{60}{180}[This is some longer text]
\annulus[cyan!20]{2}{45}{130}
\annulus[white]{3}{225}{315}[Line 1\\Line 2]
\annulus*[purple!20]{2}{165}{325}[more\\stuff]
\end{onion}
\end{document}