pgfplots: 반올림 문제 수정

pgfplots: 반올림 문제 수정

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] ...\relaxd소수점 뒤에 숫자가 있는 고정 소수점 숫자를 생성합니다 . 여기서 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생성할 수 있습니다 . 음 실제로는 우리가 나누는 가 정확히 이면 경우입니다 ).1006 digitssum100

어쨌든 코드는 다음과 같습니다.

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

인용구

관련 정보