pgfplots 使用数据表中的字符串作为条形图中的 x 轴标签

pgfplots 使用数据表中的字符串作为条形图中的 x 轴标签

我见过一些其他关于使用字符串作为 x 轴标签的线程,但没有一个适合我的情况。

我正在尝试从 CSV 文件创建条形图。只要数据中的所有内容都是数字,我就可以做到这一点。但是,在我的实际数据表中,第一行是多字字符串描述。我需要这些描述作为每个条形的 x 轴标签。

我试过了symbolic x coords,但出现了“无法将输入解析为浮点数”的错误。我还尝试添加 ID 列并将其用作 x 值,并指定xtick labels为字符串描述符。我遇到了同样的问题。

以下是 MWE 的尝试:

\documentclass{article}

\usepackage{lmodern}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

\begin{document}

\pgfplotstabletypeset[columns/category/.style={string type},col sep=comma]{Book3.csv}
\vspace{1cm}

\begin{tikzpicture}
\begin{axis}[
ybar,
xlabel=Xstuff,
ylabel=Value,
symbolic x coords={cat a,cat b,cat c,cat d,cat e,cat f,cat g},
%xtick labels={cat a,cat b,cat c,cat d,cat e,cat f,cat g},% this is from when i tried the xtick label method
xtick=data,
nodes near coords,
nodes near coords align={vertical}]
\addplot table[x=category,y=value]{Book3.csv};
%\addplot table[x=category,y=value]{Book3.csv};& again, from trying the xtick label method

\end{axis}

\end{tikzpicture}
\end{document}

由于我怀疑图表专家们可能会很快回答这个问题,所以我有一个后续问题:

我必须制作一堆这样的图表,我想让这个symbolic x coords过程自动化。有没有办法通过读取一列数据来填充可接受的 x 坐标字典?(类似symbolic x coords={columns/category/{Book3.csv}})?

Book3.csv 如下所示(如果使用该xtick label方法,则忽略 ID 列):

ID, category, value, value 2
1,  cat a,    1,     7
2,  cat b,    2,     6
3,  cat c,    3,     5
4,  cat d,    4,     4
5,  cat e,    5,     3
6,  cat f,    6,     2
7,  cat g,    7,     1

答案1

我建议不要尝试填充允许的符号坐标列表,而是使用键xticklabels from table来设置标签。您无需提供明确的ID列即可实现此功能,只需使用即可x expr=\coordindex。只要您也使用xtick=data,标签就会始终分配给正确的条形图。

\documentclass{article}

\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{filecontents}

\begin{filecontents}{testdata.csv}
category, value, value 2
cat a,    1,     7
cat b,    2,     6
cat c,    3,     5
cat d,    4,     4
cat e,    5,     3
cat f,    6,     2
cat g,    7,     1
\end{filecontents}

\pgfplotstableread[col sep=comma]{testdata.csv}\datatable
\makeatletter
\pgfplotsset{
    /pgfplots/flexible xticklabels from table/.code n args={3}{%
        \pgfplotstableread[#3]{#1}\coordinate@table
        \pgfplotstablegetcolumn{#2}\of{\coordinate@table}\to\pgfplots@xticklabels
        \let\pgfplots@xticklabel=\pgfplots@user@ticklabel@list@x
    }
}
\makeatother
\begin{document}

\begin{tikzpicture}
\begin{axis}[
ybar, ymin=0,
xlabel=Xstuff,
ylabel=Value,
flexible xticklabels from table={testdata.csv}{category}{col sep=comma},
xticklabel style={text height=1.5ex}, % To make sure the text labels are nicely aligned
xtick=data,
nodes near coords,
nodes near coords align={vertical}]
\addplot table[x expr=\coordindex,y=value]{\datatable};

\end{axis}

\end{tikzpicture}
\end{document}

相关内容