
Как следует из названия, я хотел бы создать гистограмму из целочисленных значений. Мой MWE:
\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}
Результат:
Вот что я хотел бы получить (примечание: к сожалению, я дважды посчитал значения):
Мои проблемы в том, что ось x не является дискретной, и поэтому метки смещены. Я хотел бы иметь пространство между столбцами - также между осью y и первым столбцом и в конце.
Дополнительная информация: Я использую LaTeX. Я уже пытался установить точность на 0 и использовать datatool для подсчета частот, а затем нарисовать простую столбчатую диаграмму. Я боролся с различными стилями меток и областей, но не смог достичь своей цели.
решение1
Вы можете использовать gnuplot для создания данных гистограммы, а затем построить эти данные в виде столбчатой диаграммы. Для компиляции вам необходимо установить gnuplot и скомпилировать с помощью --shell-escape
:Что делает --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}
решение2
Мы можем подготовить данные с помощью
Latex3
случайного выбора.\intarray_new:Nn \g_HISTO_myarray_intarray {9}
для хранения числа от 1 до 9 исключено (11, 12, ..., 19). Мы добавляем 10 при записи в файл\jobname.data
Если у нас уже есть готовый файл или мы хотим вручную изменить данные, мы можем изменить этот файл и прокомментировать
\histo[20]
.с
pgfplots
bar width=0.5cm
иenlarge x limits={auto},enlarge y limits={upper},
чтобы не прилипать к осям
код
\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}