![編集](https://rvso.com/image/328472/%E7%B7%A8%E9%9B%86.png)
次のプロットで、A の座標テキストの近くの右ノードが欠落しているという問題があります。この問題の原因は、データの丸め誤差です。合計は 100 になるはずですが、A では少し大きくなっています。これを回避する最善の方法は何でしょうか。A を単純に切り捨てるという選択肢はありません。このようなプロットはたくさんあり、列も多く、ほとんどすべてに合計が少し大きすぎる行があります。
\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}
答え1
最も合理的な解決策は値を正規化することだと判断しました。以下は、最後に使用したコードの簡略版です。
\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}
編集
さらにテストしてみると、正規化だけでは不十分であることが判明しました。合計が100より少し大きい場合、マークが失われる可能性があります。値を切り捨てる必要があります。pgfplots: 丸めの問題を修正。
答え2
合計が 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}
同様に、合計が100を超える行の値のみを変更することも可能である。
% 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}
}%
}