Histogramm diskreter ganzzahliger Werte

Histogramm diskreter ganzzahliger Werte

Wie der Titel schon sagt, möchte ich ein Histogramm aus ganzzahligen Werten erstellen. Mein MWE ist:

\documentclass[border=5]{standalone}

\usepackage{pgfplots}
%Random data between 10 and 20 -- could also be between 100 and 200 or what ever
\begin{filecontents*}{data.txt}
        18
        15
        18
        19
        14
        15
        12
        11
        18
        18
        12
        11
        17
\end{filecontents*}

\begin{document}
    \begin{tikzpicture}
        \begin{axis}[
            axis lines=left,
            ymajorgrids=true,
            title={Histogram},
            xlabel=points,
            ylabel=headcount,
            ybar
            ]
        \addplot+ [hist] table[y index= 0]{data.txt};
        \end{axis}
    \end{tikzpicture}
\end{document}

Das Ergebnis ist:

Bildbeschreibung hier eingeben

Was ich gerne hätte ist (Anmerkung: leider habe ich die Werte doppelt gezählt):

![Ziel](https://imgur.com/a/MZdQrYZ)

Meine Probleme sind, dass die X-Achse nicht diskret ist und deshalb die Beschriftungen verschoben sind. Ich hätte gerne Platz zwischen den Balken – auch zwischen der Y-Achse und dem ersten Balken und am Ende.

Einige zusätzliche Informationen: Ich verwende LaTeX. Ich habe bereits versucht, die Genauigkeit auf 0 zu setzen und mithilfe von Datatool zuerst die Häufigkeiten zu zählen und dann ein einfaches Balkendiagramm zu zeichnen. Ich habe mit verschiedenen Beschriftungs- und Flächenstilen gekämpft, konnte mein Ziel jedoch nicht erreichen.

Antwort1

Sie können gnuplot verwenden, um die Histogrammdaten zu erstellen und diese Daten dann als Balkendiagramm darzustellen. Zum Kompilieren müssen Sie gnuplot installiert haben und mit folgendem kompilieren --shell-escape:Was macht --shell-escape?

\begin{filecontents*}{data.txt}
18
15
18
19
14
15
12
11
18
18
12
11
17
\end{filecontents*}
\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar,
xmin=10, xmax=20,
ymin=0,
xtick distance=1,
axis lines=left,
ymajorgrids=true,
title={Not a Histogram}, xlabel=points, ylabel=headcount,
]
\addplot+[raw gnuplot] gnuplot {
binwidth=1;
bin(x,bw)=bw*floor(x/bw);
plot "data.txt" using (bin($1,binwidth)):(1.0) smooth freq;
};
\end{axis}
\end{tikzpicture}
\end{document}

Balkendiagramm der kumulierten Daten

Antwort2

  • Wir können die Daten mit Latex3und ohne Zufallsauswahl aufbereiten.

    \intarray_new:Nn \g_HISTO_myarray_intarray {9}

um Zahlen zwischen 1 und 9 zu speichern, ausgeschlossen (11, 12, ..., 19). Wir addieren 10 beim Schreiben in die Datei\jobname.data

  • Wenn wir bereits eine Datei bereit haben oder die Daten manuell ändern möchten, können wir diese Datei ändern und kommentieren \histo[20].

  • mitpgfplots

    bar width=0.5cmund enlarge x limits={auto},enlarge y limits={upper},um nicht an den Achsen zu kleben

der Code

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\ExplSyntaxOn
%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sys_gset_rand_seed:n {240210}
%%%%%%%%%%%%%%%%%%%%%%%%%%%
\int_new:N \l_HISTO_randominteger_int
\intarray_new:Nn \g_HISTO_myarray_intarray {9}
\iow_new:N \g_HISTO_iow
%
\tl_new:N \l_HISTO_table_tl
\NewDocumentCommand{\histo}{O{10}}% 10 by default
    {
        \__array_fillarray:n{#1}       
        \__array_table:       
    }

\cs_new_protected:Nn \__array_fillarray:n
{
    \int_step_inline:nnn {1} {#1} 
            {
                \int_set:Nn \l_HISTO_randominteger_int {\int_rand:nn {1} {9}}
                \intarray_gset:Nnn \g_HISTO_myarray_intarray 
                    { \l_HISTO_randominteger_int } 
                    { 
                        \intarray_item:Nn \g_HISTO_myarray_intarray {\l_HISTO_randominteger_int} + 1
                    }
                %\int_use:N \l_HISTO_randominteger_int \quad % uncomment to see the numbers
            }
    %\intarray_log:N \g_HISTO_myarray_intarray% <-- to see the intarray in the log
}

\cs_new_protected:Nn \__array_table:
    {
        \iow_open:Nn \g_HISTO_iow {\jobname.data}
        \int_step_inline:nnn {1} {9}
            {
                \tl_clear:N \l_HISTO_table_tl
                \tl_put_right:Nn \l_HISTO_table_tl {\int_eval:n {10+##1}}%<-- between 11 and 19
                \tl_put_right:Nn \l_HISTO_table_tl {~}
                \tl_put_right:Nn \l_HISTO_table_tl {
                \intarray_item:Nn \g_HISTO_myarray_intarray {##1}}         
                \iow_now:Nx \g_HISTO_iow { \l_HISTO_table_tl }
            }
        \iow_close:N \g_HISTO_iow 
    }
\ExplSyntaxOff
\begin{document}
\histo[20]

\begin{tikzpicture}
    \begin{axis}[
        %width=8cm, height=8cm,
        axis lines=left,
        ybar,
        bar width=0.5cm,
        ymajorgrids=true,
        title={Histogram ?},%<-- ?
        %
        xlabel=points,
        ylabel=headcount,
        xticklabel style = {font=\small},
        xtick=data,
        enlarge x limits={auto},
        enlarge y limits={upper},
    ]
    \addplot table[y index=1]  {\jobname.data};
    \end{axis}
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen