Ich möchte zwei Kreisdiagramme nebeneinander setzen. Jedes Kreisdiagramm hat eine eigene Beschriftung. Aktuell sind die beiden Kreise in separaten tikzpicture-Umgebungen zusammen mit der Bildunterschrift in einer Minipage.

Sobald Kreissegmente im zweiten Kreis eingezeichnet werden, vergrößert sich der Abstand zwischen dem rechten Kreis und der Bildunterschrift, so dass die Kreise auf unterschiedlicher Höhe dargestellt werden. Wie krieg ich die Kreise auf dieselbe Höhe mit demselben Abstand zur Bildunterschrift? alt text

Open in Online-Editor
\documentclass{scrbook}
\usepackage[ngerman]{babel}
\usepackage{tikz}

\begin{document}

\begin{figure}[hbt]
    \begin{minipage}[t]{0.48\linewidth}%
        \centering
        \begin{tikzpicture}%
            \filldraw[yellow, draw=blue, rotate=90] (0,0) -- (2.4cm,0cm) arc (0:322:2.4cm) -- cycle;
            \filldraw[red!20, draw=black, rotate=53] (0.2cm,0.07cm) -- (2.5cm,0.07cm) arc (0:33:2.5cm) -- cycle;
        \end{tikzpicture}%
    \caption{Bildunterschrift 1}
    \end{minipage}%
    \hfill%
    \begin{minipage}[t]{0.48\linewidth}%
        \centering\begin{tikzpicture}%
            \filldraw[yellow, draw=blue, rotate=90] (0,0) -- (2.4cm,0cm) arc (0:72:2.4cm) -- cycle;
            \filldraw[yellow, draw=blue, rotate=162] (0,0) -- (2.4cm,0cm) arc (0:36:2.4cm) -- cycle;
            \filldraw[yellow, draw=blue, rotate=198] (0,0) -- (2.4cm,0cm) arc (0:58:2.4cm) -- cycle;
            \filldraw[yellow, draw=blue, rotate=256] (0,0) -- (2.4cm,0cm) arc (0:116:2.4cm) -- cycle;
            \filldraw[yellow, draw=blue, rotate=352] (0,0) -- (2.4cm,0cm) arc (0:15:2.4cm) -- cycle;
            \filldraw[yellow, draw=blue, rotate=367] (0,0) -- (2.4cm,0cm) arc (0:45:2.4cm) -- cycle;
            \filldraw[red!20, draw=black, rotate=53] (0.2cm,0.07cm) -- (2.5cm,0.07cm) arc (0:33:2.5cm) -- cycle;
        \end{tikzpicture}%
    \caption{Bildunterschrift 2}%
    \end{minipage}%
\end{figure}

\end{document}

Danke an Qrrbrbirlbel für den bounding box Hinweis. Hier eine Quick & Dirty-Lösung, bei der mit Hilfe von \path des untersten Tortenstücks auch im linken Kreisdiagramm die bounding box höher wird. (Bounding boxes sind eingezeichnet als rot gepunktete Linien.)

Open in Online-Editor
\documentclass{scrbook}
\usepackage[ngerman]{babel}
\usepackage{tikz}

\begin{document}

\begin{figure}[hbt]
    \begin{minipage}[t]{0.48\linewidth}%
        \centering
        \begin{tikzpicture}%
            \filldraw[yellow, draw=blue, rotate=90] (0,0) -- (2.4cm,0cm) arc (0:322:2.4cm) -- cycle;
            \path[rotate=256] (0,0) -- (2.4cm,0cm) arc (0:116:2.4cm) -- cycle;
            \filldraw[red!20, draw=black, rotate=53] (0.2cm,0.07cm) -- (2.5cm,0.07cm) arc (0:33:2.5cm) -- cycle;
            \draw[red, dotted] (current bounding box.south west) rectangle
            (current bounding box.north east);
        \end{tikzpicture}%
    \caption{Bildunterschrift 1}
    \end{minipage}%
    \hfill%
    \begin{minipage}[t]{0.48\linewidth}%
        \centering\begin{tikzpicture}%
            \filldraw[yellow, draw=blue, rotate=90] (0,0) -- (2.4cm,0cm) arc (0:72:2.4cm) -- cycle;
            \filldraw[yellow, draw=blue, rotate=162] (0,0) -- (2.4cm,0cm) arc (0:36:2.4cm) -- cycle;
            \filldraw[yellow, draw=blue, rotate=198] (0,0) -- (2.4cm,0cm) arc (0:58:2.4cm) -- cycle;
            \filldraw[yellow, draw=blue, rotate=256] (0,0) -- (2.4cm,0cm) arc (0:116:2.4cm) -- cycle;
            \filldraw[yellow, draw=blue, rotate=352] (0,0) -- (2.4cm,0cm) arc (0:15:2.4cm) -- cycle;
            \filldraw[yellow, draw=blue, rotate=367] (0,0) -- (2.4cm,0cm) arc (0:45:2.4cm) -- cycle;
            \filldraw[red!20, draw=black, rotate=53] (0.2cm,0.07cm) -- (2.5cm,0.07cm) arc (0:33:2.5cm) -- cycle;
            \draw[red, dotted] (current bounding box.south west) rectangle
            (current bounding box.north east);
        \end{tikzpicture}%
    \caption{Bildunterschrift 2}%
    \end{minipage}%
\end{figure}

\end{document}

alt text

gefragt 06 Apr '15, 11:52

BraBra's gravatar image

BraBra
4294915
Akzeptiert-Rate: 20%

bearbeitet 07 Apr '15, 09:27

1

Quick Fix: \useasboundingbox(-2.4cm,-2.4cm)(2.4cm,2.54cm); am Anfang jedes tikzpictures setzen. Das setzt die Bounding Box/Größe der TikZ-Box(so wie es TeX versteht) zu einem fixen Rechteck. Bögen werden intern mit Kontrollpunkten (Bézier …) erzeugt. PGF/TikZ weiß dann nicht besser, wie es die Bounding Box berechnen soll und verwendet als Worst Case eben auch diese Kontrollpunkte. Das Problem tritt auf bei dem unteren Tortenstück (rotate=256).

Die 2.54cm sind einfach geraten. Es wäre besser den Wert direkt auszurechnen oder eine Koordinate zu setzen und zu verwenden.

(06 Apr '15, 18:41) Qrrbrbirlbel

Ich würde auf das Rotieren der Bögen verzichten und statt dessen Polarkoordinaten verwenden. Für die Teilung sind außerdem eigentlich nur Linien nötig.

Open in Online-Editor
\documentclass{scrbook}
\usepackage[ngerman]{babel}
\usepackage{tikz}

\begin{document}
\begin{figure}[hbt]
  \newcommand*\myradius{2.4}
  \begin{minipage}[t]{0.48\linewidth}%
    \centering
    \begin{tikzpicture}%
      \fill[yellow,draw=blue](0,0)--(90:\myradius)arc(90:412:\myradius)--cycle;
      \fill[red!20,draw=black,shift={(71:.2)}]
        (0,0)--(52:\myradius)arc(52:90:\myradius)--cycle;
      \draw[red,dotted]
        (current bounding box.south west) rectangle(current bounding box.north east);
    \end{tikzpicture}%
  \caption{Bildunterschrift 1}
  \end{minipage}%
  \hfill%
  \begin{minipage}[t]{0.48\linewidth}%
    \centering\begin{tikzpicture}%
      \fill[yellow, draw=blue](0,0)--(90:\myradius)arc(90:412:\myradius)--cycle;
      \foreach \w in {7,162,198,256,352}\draw[blue](0,0)--(\w:\myradius);
      \fill[red!20,draw=black,shift={(71:.2)}]
        (0,0)--(52:\myradius)arc(52:90:\myradius)--cycle;
      \draw[red,dotted]
        (current bounding box.south west)rectangle(current bounding box.north east);
    \end{tikzpicture}%
  \caption{Bildunterschrift 2}%
  \end{minipage}%
\end{figure}
\end{document}

alt text

Permanenter link

beantwortet 07 Apr '15, 12:00

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

bearbeitet 07 Apr '15, 12:03

Sehr schön, danke!

(07 Apr '15, 15:51) BraBra

Dies ist ein Bounding-Box-Problem.

TikZ (bzw. PGF) „überwacht“ bei jedem erstellten Pfad, ob der Pfad außerhalb der Dimension der aktuellen Bounding Box ist und vergrößert, wenn nötig, die Bounding Box entsprechend. Es gibt Möglichkeiten das zu unterbinden (die Option overlay ist eine davon1)). Am Ende ist für TeX ein TikZpicture nur eine Box, die das Bild enthält und eine Größe besitzt.

Da das Zeichnen eigentlich erst auf PDF-Ebene geschieht, weiß weder TeX noch TikZ genau, wo was gezeichnet wird (es wird allerdings implizit berechnet, wenn man z. B. die pos-Option verwendet oder einen Pfad dekorieren lässt). Alle zu zeichnenden Elemente lassen sich auf Bézier-Kurven zurückführen (auch Geraden), und so auch Kreise und Bögen. Dies führt bei dem unteren (dem größten) Tortenstück im rechten Bild zu einem Problem.

Für die Berechnung Bounding Box für eine Bézierkurve werden vier Punkte verwendet: Der Start- und End-Punkt sowie zwei Kontrollpunkte (die zusammenfallen können).1) Bei Kreisen fällt das normalerweise nicht ins Gewicht, solange wir nicht am Rad drehen. In deinem Fall sieht das ganze leider so aus (das rote Rechteck ist die Bounding Box, die Kreuze sind die Kontrollpunkte):
alt text

Sofern die Grafik sich nicht anders zeichnen (das wäre in diesem Spezialfall auch mein Vorschlag) lässt, bliebe dir nicht anderes übrig, als aufzupassen und das manuell zu korrigieren. Ein Vorschlag: Alles zeichnen und an dem raus geschobenen Tortenstück die letzte Koordinate speichern (hier: @, zum späteren Referenzieren), danach die bereits berechnete Bounding Box wegschmeißen (wäre das Gleiche, als hättest du vorher alle Pfade mit overlay zeichnen lassen), dann die Bounding Box neu definieren mit:

Open in Online-Editor
\useasboundingbox (-2.4cm,-2.4cm) (2.4cm,2.4cm) (@);

Ein Wort noch zu den Bögen: die Klammer-Notation ist alt und wie du vielleicht selbst festgestellt hast, nicht flexibel genug. Ich habe sie in dem Beispiel ersetzt und damit auch Gebrauch von der delta angle-Option machen können. Des Weiteren habe ich gemeinsam genutzte Optionen in einem Style tortenstueck sowie spezial gespeichert (und auch hier die Angaben für die Radien versteckt, die man im Einzelfall mit in den Optionen angibt: arc[start angle=?, end angle=?, radius=?]). Dabei ist mir aufgefallen, dass die letzten normalen Tortenstücke sich überlappen (256 + 116 = 372 ≠ 352), und das raus geschobene eigentlich auch nicht in die Lücke passt, sondern kleiner ist. Ist das so gewollt?

An dieser Stelle auch noch zwei Verweise:

  1. “Save the pies for dessert” (PDF, Englisch, 600 KB)
  2. Das nicht zu empfehlende (beachte auch meinen Kommentar) pgf-pie-Paket

Anmerkungen:

  1. Weitere Möglichkeiten die Größe eines TikZpictures zu beeinflussen, sind trim left und trim right, sowie für eine vertikale Ausrichtung die baseline-Option.
  2. Auch nicht ganz richtig: Es wird normalerweise auch noch die Liniendicke hinzugefügt.

Code

Open in Online-Editor
\documentclass{scrbook}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\tikzset{every picture/.append style={show background rectangle, tight background},
  background rectangle/.append style={red, dashed}}
\tikzset{
  tortenstueck/.style={
    fill=yellow,
    draw=blue,
    radius=+2.4cm},
  spezial/.style={
    fill=red!20,
    draw=black,
    radius=+2.5cm}}
\begin{document}
\begin{figure}[hbt]
  \begin{minipage}[t]{0.48\linewidth}
    \centering\begin{tikzpicture}
      \path[tortenstueck] (0,0) -- (90:2.4cm) arc [start angle=90, delta angle=322] -- cycle;
      \path[spezial, shift=(53+33/2:.2cm)] (0,0)
                  -- (53:2.5cm) arc [start angle=53, delta angle=33] coordinate (@) -- cycle;
      \pgfresetboundingbox
      \useasboundingbox (-2.4cm,-2.4cm) (2.4cm,2.4cm) (@);
      \draw[gray, dotted, overlay] (0,0) -- ++ (right:10cm);
    \end{tikzpicture}
  \caption{Bildunterschrift 1}
  \end{minipage}
  \hfill
  \begin{minipage}[t]{0.48\linewidth}
    \centering\begin{tikzpicture}[opacity=.5]
      \foreach \sAngle/\dAngle/\opt in {90/72/,
                                       162/36/,
                                       198/58/,
                                       256/116/,
                                       352/15/,
                                       367/45/,
                                       53/33/{shift=(53+33/2:.2cm), spezial}}
        \filldraw[tortenstueck, style/.expand once=\opt] (0,0)
          -- (\sAngle:\pgfkeysvalueof{/tikz/x radius}) arc [start angle=\sAngle, delta angle=\dAngle]
          coordinate (@) -- cycle;
      \pgfresetboundingbox
      \useasboundingbox (-2.4cm,-2.4cm) (2.4cm,2.4cm) (@);
      \draw[gray, dotted, overlay] (0,0) -- ++ (left:10cm);
    \end{tikzpicture}
  \caption{Bildunterschrift 2}
  \end{minipage}
\end{figure}
\end{document}

Ausgabe

alt text

Permanenter link

beantwortet 08 Apr '15, 00:34

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k2815
Akzeptiert-Rate: 53%

bearbeitet 08 Apr '15, 00:37

Danke für die ausführliche und tolle Erklärung!

(09 Apr '15, 09:04) BraBra
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

gestellte Frage: 06 Apr '15, 11:52

Frage wurde gesehen: 8,843 Mal

zuletzt geändert: 09 Apr '15, 09:04