我创建了这种样式,可以移动标签并将它们放在 ybars 的底部。
但是,我遇到了条形太短的问题(例如,参见下面示例中的 8.7 和 5.1)。我想检查值是否小于某个阈值,或者条形的长度是否短于标签(数字),然后更改其颜色。
当条形图较短时,如何在白色标签上叠加另一个标签?或者将标签的颜色更改为渐变色?还是仅叠加条形图外的部分?
\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usetikzlibrary{calc}
\begin{document}
\makeatletter
\begin{tikzpicture}
\begin{axis}[
ybar,
every node near coord/.style={
check for zero/.code={ % If meta=0, make the node a coordinate (which doesn't have text)
\pgfmathfloatifflags{\pgfplotspointmeta}{0}{
\pgfkeys{/tikz/coordinate}
}{}
},
check for zero, color=white, text opacity=1, font=\footnotesize, inner ysep=0.5pt,
},%
% Bottom nodes
calculate full offset/.code={
\pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
\pgfmathsetmacro\testmacro{((\pgfplotspointmeta-\pgfkeysvalueof{/pgfplots/ymin})*10^\pgfplots@data@scale@trafo@EXPONENT@y)*\pgfplots@y@veclength}
\pgfkeys{/pgf/fpu=false}
},%
nodes near coords bottom/.style={
every node near coord/.append style={
/pgfplots/calculate full offset,
yshift=-\testmacro,
rotate=90, anchor=west,%I need the rotate text here and not in the
%general style, as the ybar redefines the style
}
},%
ymin=0,
nodes near coords={\pgfmathprintnumber[fixed zerofill,precision=1]{\pgfplotspointmeta}},
nodes near coords bottom,
]
\pgfplotstableread{
% set real imag mag
1 8.7
2 5.1
3 91.8367
}\mydata
\addplot table[x index=0,y index=1,header=false] {\mydata};
\end{axis}
\end{tikzpicture}
\makeatother
\end{document}
* 编辑 *
我需要在每个标签上创建一些低于条形高度的特殊渐变。例如,我需要调整类似如何将颜色渐变设置为“仅所需文本”到每个未显示的标签。但是,我找不到将宏放入style
代码部分的方法。或者有其他等效解决方案吗?
答案1
以下是在小型 TeX 脚本中评估条件的一种方法:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usetikzlibrary{calc}
\begin{document}
\makeatletter
\begin{tikzpicture}
\begin{axis}[
ybar,
% Bottom nodes
% #1: the THRESHOLD after which we switch to a special display.
nodes near coords bottom/.style={
% a new feature since 1.9: allows to place markers absolutely:
scatter/position=absolute,
close to zero/.style={
at={(axis cs:\pgfkeysvalueof{/data point/x},\pgfkeysvalueof{/data point/y})},
},
big value/.style={
at={(axis cs:\pgfkeysvalueof{/data point/x},0)},
color=white, text opacity=1,
inner ysep=0.5pt,
},
every node near coord/.style={
check for zero/.code={%
\pgfmathfloatifflags{\pgfplotspointmeta}{0}{%
% If meta=0, make the node a coordinate (which doesn't have text)
\pgfkeys{/tikz/coordinate}%
}{%
\begingroup
% this group is merely to switch to FPU locally. Might be
% unnecessary, but who knows.
\pgfkeys{/pgf/fpu}%
\pgfmathparse{\pgfplotspointmeta<#1}%
\global\let\result=\pgfmathresult
\endgroup
%
% simplifies debugging:
%\show\result
%
\pgfmathfloatcreate{1}{1.0}{0}%
\let\ONE=\pgfmathresult
\ifx\result\ONE
% AH : our condition 'y < #1' is met.
\pgfkeysalso{/pgfplots/close to zero}%
\else
% ok, proceed as usual.
\pgfkeysalso{/pgfplots/big value}%
\fi
}
},
check for zero,
font=\footnotesize,
rotate=90, anchor=west,
},%
},%
ymin=0,
nodes near coords={\pgfmathprintnumber[fixed zerofill,precision=1]{\pgfplotspointmeta}},
nodes near coords bottom=10,
]
\pgfplotstableread{
% set real imag mag
1 8.7
2 5.1
3 91.8367
}\mydata
\addplot table[x index=0,y index=1,header=false] {\mydata};
\end{axis}
\end{tikzpicture}
\makeatother
\end{document}
以下是解释:
- 我使用了一项新功能
pgfplots 1.9
:scatter/position=absolute
。它允许使用 来放置标记,at=<coordinate expression>
这正是您在这里想要的。 - 我采用了新功能,它将始终在的上下文中
/data point/x
评估当前点的坐标(对于 类似)。x
nodes near coords
y
- 我把所有与风格密切相关的内容都移到了
nodes near coords bottom
它的定义中。 - 我定义了样式
close to zero
和big value
。我的目的是,低于预定义绝对阈值(这是的参数nodes near coords bottom
)的所有内容将使用放置close to zero
,其他所有内容使用big value
。 - 您现有的
check for zero
例程现在检查零,然后它还检查阈值并应用close to zero
或中的一个big value
。 - 我重新组织了你的风格,以
close to zero
保持情节的当前颜色并将节点移到栏外。 - 有一个复杂的项目,那就是...数学表达式解析。不知何故,这在 PGF 中不是很好;不同的数学库彼此之间无法很好地交流。:-(
- 我将阈值指定
10
为 的参数nodes near coords bottom
。