![我的问题](https://linux22.com/image/404764/%E6%88%91%E7%9A%84%E9%97%AE%E9%A2%98.png)
我有一组分数(0 到 20),例如[2, 3, 7, 14, 15, ...]
我想绘制此数据集重新划分的直方图。我的意思是,在直方图的x
- 轴上是一些标记范围(例如:0 to 1
、1 to 2
、 ... 19 to 20
), - 轴上y
是此范围内的标记数量。
例如这样的:
该图像的代码是由写入.tex
文件的 Python 程序生成的。
\documentclass[twoside]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{pgfplots}
\begin{document}
\begin{minipage}[b]{0.65\textwidth}
\begin{center}
\begin{tikzpicture}
\begin{axis}[
ymin=0, ymax=6.2 ,
ytick={0,2,...,6},
minor y tick num = 0,
%area style,
width=10cm,
height=4cm,
axis lines*=left,
bar width=0.6cm,
y axis line style = {draw = none},
tick align = outside,
tick pos = left
]\addplot+[ybar interval, mark=no, fill=black!20, draw=black!40] coordinates{(6.0,2) (6.933333333333334,2)
(6.933333333333334,1) (7.866666666666667,1)
(7.866666666666667,1) (8.8,1)
(8.8,2) (9.733333333333334,2)
(9.733333333333334,6) (10.666666666666668,6)
(10.666666666666668,3) (11.600000000000001,3)
(11.6,5) (12.533333333333333,5)
(12.533333333333333,6) (13.466666666666667,6)
(13.466666666666667,4) (14.4,4)
(14.4,2) (15.333333333333334,2)
(15.333333333333334,4) (16.266666666666666,4)
(16.266666666666666,3) (17.2,3)
(17.2,0) (18.133333333333333,0)
(18.133333333333333,2) (19.066666666666666,2)
(19.066666666666666,1) (20.0,1)
};
\addplot+[ybar interval, mark=no, fill=black!70, draw=black!90] coordinates{(15.333333333333334,4) (16.266666666666666,4) };
\end{axis}
\end{tikzpicture}
\end{center}
\end{minipage}
\end{document}
我的问题
我想知道是否可以仅使用 LaTeX(或 LuaLaTeX 等)来实现。例如,数据集将采用以下格式(其中 的8,5
法语符号是8.5
):
8,5
13,5
6,5
8,5
10
8
5,5
2,5
5,5
7
20
12
18,5
5,5
9,5
3,5
0
7
7
5,5
10
3,5
7
14,5
7
10,5
16,5
10,5
6,5
8
14
8,5
2,5
5
9,5
8
10
9,5
9
8,5
4,5
5,5
我更愿意坚持使用这种格式,但.csv
也可以考虑由 Excel 自动生成的任何格式(等)。
你会使用什么工具?你对这样的“程序”有什么建议吗?
编辑
使用示例中给出的数据集,直方图应如下图所示
答案1
可以按如下方式累积数据点。(替代方案包括堆积图。)
\documentclass[twoside]{article}
\usepackage{filecontents}
\begin{filecontents*}{commadata.dat}
8,5
13,5
6,5
8,5
10
8
5,5
2,5
5,5
7
20
12
18,5
5,5
9,5
3,5
0
7
7
5,5
10
3,5
7
14,5
7
10,5
16,5
10,5
6,5
8
14
8,5
2,5
5
9,5
8
10
9,5
9
8,5
4,5
5,5
\end{filecontents*}
\usepackage{xstring}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\newcommand*{\ReadOutElement}[4]{%
\pgfplotstablegetelem{#2}{[index]#3}\of{#1}%
\let#4\pgfplotsretval
}
\begin{document}
\begin{minipage}[b]{0.65\textwidth}
\begin{center}
\begin{tikzpicture}
\pgfplotstableread[/pgf/number format/read comma as period]{commadata.dat}\datatable
\pgfplotstablegetrowsof{\datatable}
\pgfmathtruncatemacro{\numrows}{\pgfplotsretval}
\pgfplotstablegetcolsof{\datatable}
\pgfmathtruncatemacro{\numcols}{\pgfplotsretval}
\edef\myxmax{0}%
\foreach \nY in {1,...,\numrows}
{\ReadOutElement{\datatable}{\the\numexpr\nY-1}{0}{\Current}%
\StrSubstitute{\Current}{,}{.}[\mytemp]
\pgfmathtruncatemacro{\myx}{\mytemp+1}
\pgfmathtruncatemacro{\myxmax}{max(\myxmax,\myx)}
\xdef\myxmax{\myxmax}
}
\foreach \X in {0,...,\myxmax}
{\expandafter\xdef\csname mypile\X\endcsname{0}}
\foreach \nY in {1,...,\numrows}
{\ReadOutElement{\datatable}{\the\numexpr\nY-1}{0}{\Current}%
\StrSubstitute{\Current}{,}{.}[\mytemp]
\pgfmathtruncatemacro{\myx}{\mytemp}%
\edef\currentval{\csname mypile\myx\endcsname}
\pgfmathtruncatemacro{\mycur}{\currentval+1}
\expandafter\xdef\csname mypile\myx\endcsname{\mycur}
}
\begin{axis}[
ymin=0,% ymax=6.2,
xmin=0,
%ytick={0,2,...,6},
minor y tick num = 0,
%area style,
width=10cm,
height=4cm,
axis lines*=left,
%bar width=0.2cm,
y axis line style = {draw = none},
tick align = outside,
tick pos = left
]
\pgfplotsinvokeforeach{0,...,\myxmax}{%
\edef\currentval{\csname mypile#1\endcsname}
\pgfmathtruncatemacro{\mycur}{\currentval}
\addplot[ybar, fill=black!20, draw=black!40] coordinates {(#1-0.5,\mycur)};
}
\end{axis}
\end{tikzpicture}
\end{center}
\end{minipage}
\end{document}
旧答案:可以使用 读取您的数据/pgf/number format/read comma as period
,如这个答案。为了得到宽度为 1 的间隔,我们只需要x expr=\coordindex
。
\documentclass[twoside]{article}
\usepackage{filecontents}
\begin{filecontents*}{commadata.dat}
y
8,5
13,5
6,5
8,5
10
8
5,5
2,5
5,5
7
20
12
18,5
5,5
9,5
3,5
0
7
7
5,5
10
3,5
7
14,5
7
10,5
16,5
10,5
6,5
8
14
8,5
2,5
5
9,5
8
10
9,5
9
8,5
4,5
5,5
\end{filecontents*}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{minipage}[b]{0.65\textwidth}
\begin{center}
\begin{tikzpicture}
\begin{axis}[
ymin=0,% ymax=6.2,
xmin=0,
%ytick={0,2,...,6},
minor y tick num = 0,
%area style,
width=10cm,
height=4cm,
axis lines*=left,
%bar width=0.2cm,
y axis line style = {draw = none},
tick align = outside,
tick pos = left
]
\addplot+[ybar interval, mark=no, fill=black!20, draw=black!40]
table[y=y,x expr=\coordindex,/pgf/number format/read comma as period,col sep=tab] {commadata.dat};
% \addplot+[ybar interval, mark=no, fill=black!70, draw=black!90] coordinates{(15.333333333333334,4) (16.266666666666666,4) };
\end{axis}
\end{tikzpicture}
\end{center}
\end{minipage}
\end{document}