我见过一些其他关于使用字符串作为 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}