![Editar](https://rvso.com/image/328472/Editar.png)
Eu tenho o problema de que no gráfico a seguir falta o nó direito próximo ao texto das coordenadas de A. A origem do problema é um erro de arredondamento nos dados: eles deveriam somar 100, mas em A é um pouco mais. Qual seria a melhor maneira de evitar isso? Simplesmente arredondar A para baixo não é uma opção. Tenho muitos desses gráficos, com mais colunas, e em quase todos há uma linha com uma soma um pouco grande demais.
\documentclass[]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepackage{pgfplotstable}
\pgfplotsset{
my stackbar plot/.style={
xbar stacked,
xmin=0,xmax=100,
symbolic y coords={A,B},
ytick=data,
nodes near coords={xxx},}}
\begin{document}
\begin{tikzpicture}
\pgfplotstableread[col sep=space]{
text -- -
B 50 50
A 50.01 50
}\data
\begin{axis}[my stackbar plot,]
\addplot table [x expr = \thisrow{--},y=text] {\data};
\addplot table [x expr = \thisrow{-}, y=text] {\data};
\end{axis}
\end{tikzpicture}
\end{document}
Responder1
Decidi que a solução mais sensata é normalizar os valores. Aqui está uma versão simplificada do código que usei no final:
\documentclass[]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepackage{pgfplotstable}
\pgfplotsset{
my stackbar plot/.style={
xbar stacked,
xmin=0,xmax=100,
symbolic y coords={A,B},
ytick=data,
nodes near coords={xxx},}}
\begin{document}
\begin{tikzpicture}
\pgfplotstableread[col sep=space]{
text -- -
B 50 50
A 50.01 50
}\data
\pgfplotstablecreatecol[create col/expr={\thisrow{--}+\thisrow{-}}]{sum}\data
\pgfplotstablecreatecol[create col/expr={\thisrow{--}/\thisrow{sum}*100}]{--}\data
\pgfplotstablecreatecol[create col/expr={\thisrow{-}/\thisrow{sum}*100}]{-}\data
\begin{axis}[my stackbar plot,]
\addplot table [x expr = \thisrow{--},y=text] {\data};
\addplot table [x expr = \thisrow{-}, y=text] {\data};
\end{axis}
\end{tikzpicture}
\end{document}
Editar
Outros testes revelaram que a normalização não é suficiente. O total ainda pode ser um pouco maior que 100 e a marca pode se perder. É necessário truncar os valores, vejapgfplots: corrija problemas de arredondamento.
Responder2
Também é possível normalizar apenas valores em linhas que não somam 100:
\documentclass[]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepackage{pgfplotstable}
\pgfplotsset{
my stackbar plot/.style={
xbar stacked,
xmin=0,xmax=100,
symbolic y coords={A,B},
ytick=data,
nodes near coords={xxx},}}
\begin{document}
\begin{tikzpicture}
\pgfplotstableread[col sep=space]{
text -- -
B 50 50
A 50.01 50
}\data
\pgfplotstablecreatecol[create col/expr={\thisrow{--}+\thisrow{-}}]{sum}\data
% normalize only if the sum is not 100
\pgfplotsinvokeforeach{--,-}{%
\pgfplotstablemodifyeachcolumnelement{#1}\of\data\as\wert{%
\pgfplotstablegetelem{\pgfplotstablerow}{sum}\of\data%
\pgfmathparse{\pgfplotsretval==100?\wert:\wert*100/\pgfplotsretval}%
\edef\wert{\pgfmathresult}
}%
}
\begin{axis}[my stackbar plot,]
\addplot table [x expr = \thisrow{--},y=text] {\data};
\addplot table [x expr = \thisrow{-}, y=text] {\data};
\end{axis}
\end{tikzpicture}
\end{document}
Da mesma forma é possível alterar apenas os valores nas linhas cuja soma seja superior a 100 usando
% normalize only if the sum is >100
\pgfplotsinvokeforeach{--,-}{%
\pgfplotstablemodifyeachcolumnelement{#1}\of\data\as\wert{%
\pgfplotstablegetelem{\pgfplotstablerow}{sum}\of\data%
\pgfmathparse{\pgfplotsretval<=100?\wert:\wert*100/\pgfplotsretval}%
\edef\wert{\pgfmathresult}
}%
}