![pgfplots: 반올림 문제 수정](https://rvso.com/image/328833/pgfplots%3A%20%EB%B0%98%EC%98%AC%EB%A6%BC%20%EB%AC%B8%EC%A0%9C%20%EC%88%98%EC%A0%95.png)
xmax가 100으로 설정된 동안 데이터 합계가 100을 초과하므로 마커가 사라지는 문제가 있었습니다.pgfplots: 반올림 문제로 인해 좌표 근처의 노드가 누락되었습니다..
인용된 질문에 대한 답변에 쓰여진 대로 값을 100으로 정규화하여 문제를 피하려고 했습니다. 그러나 이로 인해 이전에 올바른 행에서 (훨씬 더 작은) 반올림 오류가 발생하고 이제 마커가 사라집니다. 다음 예를 참조하세요. 정규화 전에는 F열이 영향을 받고 B열 이후에는 영향을 받습니다.
나는 어떻게 할 수 있습니까?믿을 수 있는이 반올림 문제를 피하는 방법은 무엇입니까? 아니면 적어도 명확한 오류 메시지를 받으십시오. 나는 이 플롯을 상당히 많이 가지고 있으며 누락된 마커가 있는지 항상 확인하고 싶지 않습니다.
\documentclass{scrreprt}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepackage{pgfplotstable}
\pgfplotsset{
my stackbar plot/.style={
xbar stacked,
xmin=0,xmax=100,
symbolic y coords={A,B,C,D,E,F,G},
ytick=data,
nodes near coords={xxx},}}
\begin{document}
\pgfplotstableread[col sep=space]{
text -- - + ++
A 0.0 1.7 13.8 84.5
B 0.0 0.6 20.1 79.3
C 0.0 1.9 13.2 84.9
D 0.0 1.6 27.9 70.5
E 1.3 3.9 19.5 75.3
F 0.0 1.4 15.0 83.7
G 0.3 1.7 24.8 73.2
}\data
\pgfplotstablecreatecol[create col/expr={\thisrow{--}+\thisrow{-}+\thisrow{+}+\thisrow{++}}]{sum}\data %
\pgfplotstablecreatecol[create col/copy=--]{--o}\data
\pgfplotstablecreatecol[create col/copy=-]{-o}\data
\pgfplotstablecreatecol[create col/copy=+]{+o}\data
\pgfplotstablecreatecol[create col/copy=++]{++o}\data
\pgfplotstablecreatecol[create col/expr={100/\thisrow{sum}*\thisrow{--o}}]{--}\data
\pgfplotstablecreatecol[create col/expr={100/\thisrow{sum}*\thisrow{-o}}]{-}\data
\pgfplotstablecreatecol[create col/expr={100/\thisrow{sum}*\thisrow{+o}}]{+}\data
\pgfplotstablecreatecol[create col/expr={100/\thisrow{sum}*\thisrow{++o}}]{++}\data
\pgfplotstablecreatecol[create col/expr={\thisrow{--}+\thisrow{-}+\thisrow{+}+\thisrow{++}}]{sumnew}\data
\pgfplotstabletypeset[columns={text,sum} ,precision=10,columns/text/.style={string type}]\data \quad
\pgfplotstabletypeset[columns={text,sumnew},precision=10,columns/text/.style={string type}]\data
%\pgfplotstablesave{\data}{pgfplotstempout.dat}
\begin{tikzpicture}
\begin{axis}[my stackbar plot]
\addplot table [x expr = \thisrow{--o},y=text] {\data};
\addplot table [x expr = \thisrow{-o}, y=text] {\data};
\addplot table [x expr = \thisrow{+o}, y=text] {\data};
\addplot table [x expr = \thisrow{++o}, y=text] {\data};
\end{axis}
\end{tikzpicture}
\quad
\begin{tikzpicture}
\begin{axis}[my stackbar plot]
\addplot table [x expr = \thisrow{--},y=text] {\data};
\addplot table [x expr = \thisrow{-}, y=text] {\data};
\addplot table [x expr = \thisrow{+}, y=text] {\data};
\addplot table [x expr = \thisrow{++}, y=text] {\data};
\end{axis}
\end{tikzpicture}
\end{document}
답변1
다음은 사용 방법입니다.\usepackage{xintexpr}
:
\xinttheiexpr [d] ...\relax
d
소수점 뒤에 숫자가 있는 고정 소수점 숫자를 생성합니다 . 여기서d
는 숫자입니다.d =1, 2, ...
그것라운드정확하게 계산된 결과입니다.\xinttheexpr trunc(..., d)\relax
동일하지만 반올림하는 대신잘림. (i
반올림이 포함된 모호한 구문에 대해 죄송합니다 .i
잘림은 없습니다. 현재 발생하고 있는 일은 일부를\xinttheiexpr [d,trunc] ... \relax
구현해야 한다는 것입니다. 구문을 장황하게 만들고 싶지 않기 때문에 구문으로 무엇을 선택해야 할지 난감합니다.[d↓]
...).
\xinttheexpr, \xinttheiexpr
특히 f-확장 가능 과 같이 순수 확장으로 작동하는 작업이 허용되는 위치에서 이것을 사용할 수 있습니다 . ( xint
정확히 의미하는 바는 문서를 참조하세요).
다음은 덜 장황하게 편집한 후에도 작성자조차도 이해할 수 없는 몇 가지 설명입니다.
요약에는 sumnew
반올림된 4개의 숫자를 추가합니다. 각 (고정 소수점) 반올림에서는 최대 의 절대 오류가 발생하므로 5 10^-7
정확한 합계에는 최대 의 오류가 있습니다 2 10^-6 = 0.02 10^-4
. 이제 이를 4자리로 반올림하면 .의 오류가 발생할 수 있습니다 0.52 10^-4
. 즉, 정확한 합계를 정확하게 반올림한 것이 아니라 off by 1
마지막 위치에 있는 단위에 대한 것일 수 있습니다. S_exact
여기서 논의하고 있는 것은 계산 된 합계가 100 (exact sum of the original data)/S_pgfplots
어디에 S_pgfplots
있는지 pgfplots
이므로 에 가깝습니다 100
.
다시 스케일링된 피가수를 먼저 6자리로 자르면 계산된 합계는 4 10^-6=0.04 10^-4
실제 합계보다 많아야 더 작을 수 있습니다. 이를 다시 4자리로 자르면 off by 1
정확한 합계의 잘림과 비교할 때 기껏해야 마지막 자리에 있지만 정확한 결과보다 낮다는 것을 알 수 있다는 이점이 있습니다. 정확한 결과가 정확하게 이면 100
이 절차는 항상 생성될 것이라고 거의 보장됩니다 ( 모든 비율이 에서 정확할 경우에만 99.9999
생성할 수 있습니다 . 음 실제로는 우리가 나누는 가 정확히 이면 경우입니다 ).100
6 digits
sum
100
어쨌든 코드는 다음과 같습니다.
\documentclass{scrreprt}
\usepackage{xintexpr}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\usepackage{pgfplotstable}
\pgfplotsset{
my stackbar plot/.style={
xbar stacked,
xmin=0,xmax=100,
symbolic y coords={A,B,C,D,E,F,G},
ytick=data,
nodes near coords={xxx},}}
\begin{document}
\pgfplotstableread[col sep=space]{
text -- - + ++
A 0.0 1.7 13.8 84.5
B 0.0 0.6 20.1 79.3
C 0.0 1.9 13.2 84.9
D 0.0 1.6 27.9 70.5
E 1.3 3.9 19.5 75.3
F 0.0 1.4 15.0 83.7
G 0.3 1.7 24.8 73.2
}\data
\pgfplotstablecreatecol[create col/expr={\thisrow{--}+\thisrow{-}+\thisrow{+}+\thisrow{++}}]{sum}\data %
\pgfplotstablecreatecol[create col/copy=--]{--o}\data
\pgfplotstablecreatecol[create col/copy=-]{-o}\data
\pgfplotstablecreatecol[create col/copy=+]{+o}\data
\pgfplotstablecreatecol[create col/copy=++]{++o}\data
\pgfplotstablecreatecol[create col/expr={\xinttheiexpr[6]
100/\thisrow{sum}*\thisrow{--o}\relax}]{--}\data
\pgfplotstablecreatecol[create col/expr={\xinttheiexpr[6]
100/\thisrow{sum}*\thisrow{-o}\relax}]{-}\data
\pgfplotstablecreatecol[create col/expr={\xinttheiexpr[6]
100/\thisrow{sum}*\thisrow{+o}\relax }]{+}\data
\pgfplotstablecreatecol[create col/expr={\xinttheiexpr[6]
100/\thisrow{sum}*\thisrow{++o}\relax }]{++}\data
\pgfplotstablecreatecol[create col/expr={\xinttheiexpr [6]
\thisrow{--}+\thisrow{-}+\thisrow{+}+\thisrow{++}\relax}]{sumnew}\data
% better? or even without [4] to get 100 as rounded integer ?
% \pgfplotstablecreatecol[create col/expr={\xinttheiexpr[4]
% \thisrow{--}+\thisrow{-}+\thisrow{+}+\thisrow{++}\relax}]{sumnew}\data
\pgfplotstabletypeset[columns={text,sum} ,precision=10,columns/text/.style={string type}]\data \quad
\pgfplotstabletypeset[columns={text,sumnew},precision=10,columns/text/.style={string type}]\data
%\pgfplotstablesave{\data}{pgfplotstempout.dat}
\begin{tikzpicture}
\begin{axis}[my stackbar plot]
\addplot table [x expr = \thisrow{--o},y=text] {\data};
\addplot table [x expr = \thisrow{-o}, y=text] {\data};
\addplot table [x expr = \thisrow{+o}, y=text] {\data};
\addplot table [x expr = \thisrow{++o}, y=text] {\data};
\end{axis}
\end{tikzpicture}
\quad
\begin{tikzpicture}
\begin{axis}[my stackbar plot]
\addplot table [x expr = \thisrow{--},y=text] {\data};
\addplot table [x expr = \thisrow{-}, y=text] {\data};
\addplot table [x expr = \thisrow{+}, y=text] {\data};
\addplot table [x expr = \thisrow{++}, y=text] {\data};
\end{axis}
\end{tikzpicture}
\end{document}