TeXwelt wurde neu installiert. Es funktionieren noch nicht alle Features und auch an den deutschsprachigen Formulierungen wird verbessert. Danke für eure Geduld.

Das Diagramm sieht bei 7 Einträgen in der Liste in Ordnung aus. Wenn sich aber die Anzahl der Einträge ändert bleibt die Breite des Diagramms gleich. Wie kann ich die Breite variabel machen?

Öffne in Overleaf
% \RequirePackage{filecontents}  % evtl. brauchbar
\begin{filecontents}{data.csv}
    Nr, Name, Vorname, Stimmen
    1, Name1, Vorname1, 13
    2, Name2, Vorname2, 36
    3, Name3, Vorname3, 15
    4, Name4, Vorname4, 13
    5, Name5, Vorname5, 6
    6, Name6, Vorname6, 12
    7, Name7, Vorname7, 25
\end{filecontents}

\documentclass[tikz]{standalone}
\usepackage[utf8]{inputenc}

\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}

\makeatletter
\pgfplotsset{
    /pgfplots/flexible xticklabels from table/.code n args={3}{%
        \pgfplotstableread[#3]{#1}\coordinate@table
        \pgfplotstablegetcolumn{#2}\of{\coordinate@table}\to\pgfplots@xticklabels
        \let\pgfplots@xticklabel=\pgfplots@user@ticklabel@list@x
    }
}
\makeatother

\newcommand{\saeulendiagramm}[1]{   
    \begin{tikzpicture}
        \begin{axis}[
            ybar,
            xtick=data,
            ymajorgrids=true,
            bar width=0.7cm, 
            xtick align=inside,
            ylabel={Stimmen},
            flexible xticklabels from table={#1}{Name}{col sep=comma},
            x tick label style={font=\normalsize, rotate=45, anchor=east}
        ]
            %\addplot[fill=blue] table [x index=0,y index=3, col sep = comma] {#1};
            \addplot+[fill=blue] table[x expr=\coordindex,y index = 3, col sep=comma] from {#1};
        \end{axis}
    \end{tikzpicture}
}

\begin{document}
    \saeulendiagramm{data.csv}
\end{document}

gefragt 13 Mai, 15:47

vince6e74's gravatar image

vince6e74
317
Akzeptiert-Rate: 0%

bearbeitet 14 Mai, 00:43

cis's gravatar image

cis
9.3k21213362

PS: Dein Edit war nicht nötig. Mit filecontents war schon goldrichtig! Zum Problem - Morgen mal schauen (falls niemand schneller ist).

(14 Mai, 00:44) cis

Die Breite des plots ist mit width änderbar, z.B. \begin{axis}[width=10cm,....

(15 Mai, 03:22) Gelöscht

@Murmeltier Das Festlegen einer absoluten Breite entspricht meiner 'alten AW'. Da er das automatisch haben will, hatte ich die width abhängig von der Zeilenzahl der Tabelle berechnen lassen. Aber m.E. reicht bereits das Angeben eines Maßstabs ('x=1.5' / 'x=9mm'), um eine automatische Anpassung zu erreichen.

(15 Mai, 13:45) cis

Neue Antwort:

Du musst scheints einfach den x-Maßstab anpassen, dann verbreitert sich das Diagramm automatisch:
x=9mm, %bar width =0.9 % 7mm % optional

alt text

Ich finde das Auslesen der Zeilenanzahl usw. allerdings spaßiger....

Alte Antwort:

Das ist in der Tat ein interessanter Effekt, ob das wohl Absicht ist?

Bekanntlich lässt sich die absolute Breite des pgfplots-Graphen festlegen (width=10cm).

Also könntest Du die Zeilenzahl auslesen und ggf. noch einen Streckfaktor ergänzen und damit die absolute Breite des jeweiligen Graphen festlegen

\pgfplotstablegetrowsof{\jobname-data.csv} \pgfmathsetmacro{\Breite}{1.2*(\pgfplotsretval-1)} % Zeilenzahl x Streckfaktor % DAMIT: \saeulendiagramm[width=\Breite cm, %bar width=5mm, % optional title={Neu (width=\Breite cm):}]{\jobname-data.csv}

alt text

Hinweise:
·Vielleicht ist es noch sinnvoll eine height=7cm festzulegen, für einheitliche Höhe, aber verschiedene Breite.
·Soll es ganz automatisch laufen, muss ggf. etwas getan werden, dass die \textwidth nicht überschritten wird.

Öffne in Overleaf
\RequirePackage{filecontents}  % evtl. brauchbar
\begin{filecontents*}{\jobname-data.csv}
    Nr, Name, Vorname, Stimmen
    1, Name1, Vorname1, 13
    2, Name2, Vorname2, 36
    3, Name3, Vorname3, 15
    4, Name4, Vorname4, 13
    5, Name5, Vorname5, 6
    6, Name6, Vorname6, 12
    7, Name7, Vorname7, 25
    8, Name7, Vorname7, 26
    9, Name7, Vorname7, 27
    10, Name7, Vorname7, 28
    11, Name7, Vorname7, 29
    12, Name7, Vorname7, 30
\end{filecontents*}

%\documentclass[]{article}
\documentclass[tikz]{standalone}
\usepackage[utf8]{inputenc}

\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}

\makeatletter
\pgfplotsset{
    /pgfplots/flexible xticklabels from table/.code n args={3}{%
        \pgfplotstableread[#3]{#1}\coordinate@table
        \pgfplotstablegetcolumn{#2}\of{\coordinate@table}\to\pgfplots@xticklabels
        \let\pgfplots@xticklabel=\pgfplots@user@ticklabel@list@x
    }
}
\makeatother

\newcommand{\saeulendiagramm}[2][]{   
\begin{tikzpicture}
\begin{axis}[
            ybar,% ybar interval=0.7, xmin=0,
            xtick=data,
            ymajorgrids=true,
            bar width=0.7cm, 
            xtick align=inside,
            ylabel={Stimmen},
            flexible xticklabels from table={#2}{Name}{col sep=comma},
            x tick label style={font=\normalsize, rotate=45, anchor=east},
% Neu
#1, 
]
%\addplot[fill=blue] table [x index=0,y index=3, col sep = comma] {#1};
\addplot+[fill=blue, 
draw=red, %<---- 
] table[x expr=\coordindex,y index = 3, col sep=comma, columns=1, ] from {#2};
\end{axis}
\end{tikzpicture}
}

\begin{document}
\saeulendiagramm[skip coords between index={7}{999}, title=Alt:]{\jobname-data.csv}

\pgfplotstablegetrowsof{\jobname-data.csv}
\pgfmathsetmacro{\Breite}{1.2*(\pgfplotsretval-1)}  % Zeilenzahl x Streckfaktor

\saeulendiagramm[width=\Breite cm,
%bar width=5mm,  % optional
title={Neu (width=\Breite cm):}]{\jobname-data.csv}

\end{document}
Permanenter link

beantwortet 14 Mai, 13:59

cis's gravatar image

cis
9.3k21213362
Akzeptiert-Rate: 29%

bearbeitet 14 Mai, 19:59

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:

×273
×38
×6

gestellte Frage: 13 Mai, 15:47

Frage wurde gesehen: 525 Mal

zuletzt geändert: 15 Mai, 13:46