Editar

Editar

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} 

insira a descrição da imagem aqui

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}

insira a descrição da imagem aqui

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}

insira a descrição da imagem aqui

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}
  }%
}

informação relacionada