Hallo, ich bin gerade am verzweifeln. Ich möchte ein Balkendiagramm mit tikz, pgfplots erstellen. Zu jedem Wert gibt es drei Balken. Das Problem ist, dass ich den Abstand zwischen den beiden Plots nicht verkürzen kann. Ich würde gerne den weißen Abstand in der Mitte verkleinern, weiß aber nicht wie. Kann mir jemand helfen?

Mein Code:

Open in Online-Editor
\documentclass{scrartcl} 
\usepackage[ngerman]{babel} 
\usepackage{tikz}
\usepackage{pgfplots} 
\pgfplotsset{compat=1.9} 
\usepackage{pgfplotstable}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
    x tick label style={
        /pgf/number format/1000 sep=},
    ylabel=Population,
    enlargelimits=0.15,
    ybar,
    bar width=7pt,
    xtick={1930,1940},
    xmin=1930, xmax=1940
]
\addplot 
    coordinates {(1930,50e6) (1940,33e6)};

\addplot 
    coordinates {(1930,38e6) (1940,42e6)};

\addplot 
    coordinates {(1930,15e6) (1940,12e6)};

\addplot[red,sharp plot,update limits=false] 
    coordinates {(1910,4.3e7) (1990,4.3e7)} 
    node[above] at (axis cs:1950,4.3e7) {Houses};
\end{axis}
\end{tikzpicture}

\end{document}

Das Liefert folgendes:

Ist

Ich hätte gerne aber soetwas:

Soll

Ich hoffe ihr könnt mir helfen.

gefragt 18 Jul '16, 16:34

DerMetzger's gravatar image

DerMetzger
81224
Akzeptiert-Rate: 0%

bearbeitet 18 Jul '16, 18:20

saputello's gravatar image

saputello
11.1k174365

Sobald Du 60 Punkte erreicht hast, Bilder bitte direkt hier hochladen und einbinden. Das geht dann über das Foto-Symbol in der Toolbar ganz einfach. Wenn Du weiter Fragen mit klarer Problembeschreibung und ordentlichem Minimalbeispiel stellst, wirst Du die dafür notwendigen Punkte sicher schnell zusammen haben. Ich würde Dir für diese gut gestellte erste Frage gerne ein paar Punkte schenken. Leider kann man das nur für Antworten.

(18 Jul '16, 18:23) saputello

Du musst nur die Größe des Plots ändern. Ich habe

Open in Online-Editor
enlarge x limits=0.5,
width=5cm, height=\axisdefaultheight,

gewählt. Das enlarge x limits=0.5 ist dazu da, dass die Balken nicht rauslaufen und verschwinden. Bei height kann man natürlich auch eine explizit Höhe eintragen, \axisdefaultheight ist halt der Standard.

Möchte man die Größe nicht ändern, so kann man natürlich einfach die Limits der x-Achse vergrößern, zum Beispiel xmin=1920, xmax=1950.

Open in Online-Editor
\documentclass{article} 
\usepackage{pgfplots} 
\pgfplotsset{compat=1.9}

\begin{document}

\begin{tikzpicture}
  \begin{axis}[
    x tick label style={
      /pgf/number format/1000 sep=},
    ylabel=Population,
    enlargelimits=0.15,
    ybar,
    bar width=7pt,
    xtick={1930,1940},
    xmin=1930, xmax=1940,
    %---
    enlarge x limits=0.5,
    width=5cm, height=\axisdefaultheight,
    ]
    \addplot 
      coordinates {(1930,50e6) (1940,33e6)};

    \addplot 
      coordinates {(1930,38e6) (1940,42e6)};

    \addplot 
      coordinates {(1930,15e6) (1940,12e6)};

    \addplot[red,sharp plot,update limits=false] 
      coordinates {(1910,4.3e7) (1990,4.3e7)} 
      node[above] at (axis cs:1950,4.3e7) {Houses};
  \end{axis}
\end{tikzpicture}

\end{document}

alt text

Permanenter link

beantwortet 18 Jul '16, 16:50

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 18 Jul '16, 16:51

Super! Vielen Dank, das löst jetzt mein Problem für symbolic x coords Danke

(18 Jul '16, 17:07) DerMetzger

Eine weitere Möglichkeit wäre, eine Länge für eine x-Einheit vorzugeben:

Open in Online-Editor
x=5pt,% hier mindestens 2.7pt
enlarge x limits={abs=25pt},% hier mind. 12.5pt

alt text

Open in Online-Editor
\documentclass{scrartcl} 
\usepackage[ngerman]{babel} 
\usepackage{pgfplots}% lädt auch tikz
\pgfplotsset{compat=1.9} 
\begin{document}
\begin{tikzpicture}
\begin{axis}[
    x=5pt,
    enlarge x limits={abs=25pt},
    x tick label style={/pgf/number format/1000 sep=},
    ylabel=Population,
    ybar,
    bar width=7pt,
    xtick={1930,1940},
    xmin=1930, xmax=1940
]
\addplot coordinates {(1930,50e6) (1940,33e6)};
\addplot coordinates {(1930,38e6) (1940,42e6)};
\addplot coordinates {(1930,15e6) (1940,12e6)};

\addplot[red,sharp plot,update limits=false] 
    coordinates {(1910,4.3e7) (1990,4.3e7)} 
    %node[above] at (axis cs:1950,4.3e7) {Houses}% außerhalb des Plotbereiches
    ;
\end{axis}
\end{tikzpicture}
\end{document}

Die Werte ergeben sich aus folgenden Überlegungen: Du hast drei Plots bei denen die Balken jeweils 7pt breit sind. Außerdem ist zwischen den Balken, die zum gleichen x- Wert gehören ein Abstand von 2pt. Die drei Balken einschließlich der Abstände haben also eine Breite von 25pt. Wenn der Abstand zwischen den Balkengruppen genauso groß sein soll, dann braucht man also 50pt. Zwischen den beiden Ticks bei 1930 und 1940 liegen 10 x-Einheiten. Somit müsste eine x-Einheit 5pt breit sein.

Da die Breite der Balken beim Ermitteln der nötigen Breite für den Plot nicht berücksichtigt wird, muss über enlarge x limits dafür gesorgt werden, dass die Balken nicht abgeschnitten werden. Diese zusätzliche Breite muss mindestens so groß sein wie die halbe Breite einer Balkengruppe. Hier also mindestens 12.5pt. Damit sie auch nicht ganz am Rand kleben, habe ich 25pt verwendet.


Das funktioniert auch mit symbolischen Koordinaten. Dann entspricht eine x-Einheit dem Abstand von zwei aufeinanderfolgenden Koordinaten. Im folgenden Beispiel wird deshalb x=50pt verwendet.

Open in Online-Editor
\documentclass{scrartcl} 
\usepackage[ngerman]{babel} 
\usepackage{pgfplots}% lädt auch tikz
\pgfplotsset{compat=1.9} 
\begin{document}
\begin{tikzpicture}
\begin{axis}[
    x=50pt,
    enlarge x limits={abs=25pt},
    x tick label style={/pgf/number format/1000 sep=},
    ylabel=Population,
    ybar,
    bar width=7pt,
    symbolic x coords={left,1930,1940,right},
    xtick=data
]
\addplot coordinates {(1930,50e6) (1940,33e6)};
\addplot coordinates {(1930,38e6) (1940,42e6)};
\addplot coordinates {(1930,15e6) (1940,12e6)};

\addplot[red,sharp plot,update limits=false] 
    coordinates {(left,4.3e7) (right,4.3e7)} 
    ;
\end{axis}
\end{tikzpicture}
\end{document}
Permanenter link

beantwortet 19 Jul '16, 01:18

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

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:

×298
×14
×12
×3

gestellte Frage: 18 Jul '16, 16:34

Frage wurde gesehen: 14,391 Mal

zuletzt geändert: 19 Jul '16, 01:18