如何使用 pgfplots 调整标签的颜色

如何使用 pgfplots 调整标签的颜色

我创建了这种样式,可以移动标签并将它们放在 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.9scatter/position=absolute。它允许使用 来放置标记,at=<coordinate expression>这正是您在这里想要的。
  • 我采用了新功能,它将始终在的上下文中/data point/x评估当前点的坐标(对于 类似)。xnodes near coordsy
  • 我把所有与风格密切相关的内容都移到了nodes near coords bottom它的定义中。
  • 我定义了样式close to zerobig 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

相关内容