我的问题

我的问题

我有一组分数(0 到 20),例如[2, 3, 7, 14, 15, ...]

我想绘制此数据集重新划分的直方图。我的意思是,在直方图的x- 轴上是一些标记范围(例如:0 to 11 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}

在此处输入图片描述

相关内容