我想
- 创建条形图
- 直接从文件读取数据,
- 直接在栏内/上方添加详细描述
- 并将实际值写在实际坐标附近
- 根据列设置条形颜色
我希望的结果是这样的:
这就是我目前得到的:
\documentclass{article}
\usepackage[utf8x]{inputenc}
\usepackage{pgfplots,pgfplotstable}
\pgfplotsset{compat=1.9}
\pgfplotstableread[col sep=comma]{
surname,prename,values
Miller,Martin,0.8
Public,John,0.4
Miller,Catherine,0.6
}\testdata
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xbar,
ytick = data,
yticklabels from table={\testdata}{surname},
major y tick style = transparent,
]
\addplot table[y expr=\coordindex,x=values]{\testdata};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
您可以使用 放置条形图的描述nodes near coords
。默认情况下,这将打印meta
条形图末尾的值,而该值又默认为因变量(在本例中为 x 坐标)。
要打印该prename
值,需要几个步骤:首先,您需要使该列的内容可供 PGFPlots 使用。您可以通过添加point meta=explicit symbolic
到\addplot
选项(指示 PGFPlots 期望每个数据点都有某种非数字辅助数据)来实现这一点。table
然后,您可以在选项中设置meta=prename
。然后,通过使用,该列的内容prename
将可用于每个数据点\pgfkeysvalueof{/pgfplots/meta}
。
然后,您需要找到一种方法将其打印在所需的位置。不幸的是,nodes near coords
只能打印一个节点。幸运的是,您可以教 PGFPlots 通过使用“搭载”到此节点来打印额外的节点every node near coord/.append style={append after command=node {<some text>}
。这将附加node {<some text>}
在标签节点之后。
为了正确定位这个额外的节点,您需要移动它。默认情况下,它位于条形图的顶端。要将其定位在条形图的底部,您可以使用node [anchor=west] at (axis direction cs:-\pgfkeysvalueof{/data point/x}+\pgfkeysvalueof{/pgfplots/xmin},0)
。注意:/pgfplots/xmin
只有当您希望条形图从零以外的某个值开始时,才是必要的,这通常不是一个好主意。正如 Ethan 在评论中指出的那样,这通常会产生误导。如果您想通过减小绘图范围来突出显示差异,请考虑使用点而不是条形图。
您会注意到,如果执行此操作,prename
列的内容会打印两次:一次在底部,一次在顶部。要取回 x 值,请设置nodes near coords=\pgfkeysvalueof{/data point/x}
(而不仅仅是nodes near coords
,这是 的简写nodes near coords=\pgfmathprintnumber{\pgfplotspointmeta}
)。
以下是我们努力的结果:
...代码如下:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots,pgfplotstable}
\pgfplotsset{compat=1.9}
\pgfplotstableread[col sep=comma]{
surname,prename,values
Miller,Martin,0.8
Public,John,0.4
Miller,Catherine,0.6
}\testdata
\begin{document}
\begin{tikzpicture}
\begin{axis}[
xmin=0,
xbar,
ytick = data,
yticklabels from table={\testdata}{surname},
major y tick style=transparent,
point meta=explicit symbolic
]
\addplot +[
nodes near coords=\pgfkeysvalueof{/data point/x},
every node near coord/.append style={
anchor=west,
append after command={
node [anchor=west] at (axis direction cs:-\pgfkeysvalueof{/data point/x}+\pgfkeysvalueof{/pgfplots/xmin},0) {\pgfkeysvalueof{/data point/meta}}}
}
] table [y expr=\coordindex, meta=prename, x=values]{\testdata};
\end{axis}
\end{tikzpicture}
\end{document}