
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:
Was ich gerne hätte ist (Anmerkung: leider habe ich die Werte doppelt gezählt):
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}
Antwort2
Wir können die Daten mit
Latex3
und 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]
.mit
pgfplots
bar width=0.5cm
undenlarge 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}