PGFPlots로 토네이도 플롯을 생성하고 수평 막대 중 하나를 강제로 끊습니다.

PGFPlots로 토네이도 플롯을 생성하고 수평 막대 중 하나를 강제로 끊습니다.

민감도 분석을 표시하려면토네이도 음모. 플롯에서 특정 기본 사례 값은 모델의 매개변수를 변경한 후 생성된 값과 비교됩니다. 나는 이것부터 시작했다. 이를 통해 나는 다음과 같은 MWE를 얻을 수 있었습니다.

\usepackage{pgf}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{positioning}
\usetikzlibrary{calc}
\usetikzlibrary{intersections,backgrounds}
\usetikzlibrary{decorations.pathmorphing}

\pgfplotsset{
    TornadoPlot/.style={% Overall settings
        width = 1\textwidth,
    line width=1pt,
    tick style={line width=0.8pt},
    xmin = -50, xmax = 50,
    xtick       = {-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50},
    xticklabels = {-50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50},
    xmajorgrids = true,
    minor x tick num = 1,
    tick align = outside,
    xtick pos = left, ytick pos = left,
    xbar, bar shift=0pt,
    height = 7cm,
    enlarge y limits = 0.1, ytick = {0,1,2,3,4,5,6},
    nodes near coords={
        \pgfkeys{/pgf/fpu=true}%
        \pgfmathparse{\pgfplotspointmeta}%
        \pgfmathprintnumber{\pgfmathresult}
    },
    nodes near coords align = {horizontal},
    before end axis/.code={
        \draw ({rel axis cs:0,0}-|{axis cs:0,0}) -- ({rel axis cs:0,1}-|{axis    cs:0,0});
    }           
  }
}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[TornadoPlot, legend style={at={(0.975,0.25)}}]
            \addplot[fill=green!40] coordinates{(-3.5,0) (-16,1) (-17.5,2) (-19,3) (-34,4) (-27,5) (-22,6)};
            \addplot[fill=red!40] coordinates{(4,0) (19,1) (12.5,2) (28.5,3) (34,4) (82,5) (38,6)};
            \legend{upside, downside} 
    \end{axis}
\end{tikzpicture}
\end{document}

그러나 막대 중 하나(82, 5)에는 플롯 영역 범위를 벗어나는 양의 x 값이 있습니다. x의 원래 값을 계속 표시하면서 해당 막대의 길이를 제한하고 강제로 중단할 수 있습니까? 나는 보았다수직 막대 차트의 경우, 지금까지는 토네이도 플롯에 대해 이를 재현할 수 없었습니다.

답변1

그래 넌 할수있어. 이를 수행하는 방법에 대한 자세한 내용은 코드의 주석을 살펴보시기 바랍니다.

% used PGFPlots v1.14
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
    \pgfplotsset{
        TornadoPlot/.style={% Overall settings
            width=\textwidth,
            height=7cm,
            xmin=-50,
            xmax=50,
            line width=1pt,
            tick style={line width=0.8pt},
            xmajorgrids=true,
            minor x tick num=1,
            tick align=outside,
            tick pos=left,
            xbar,
            bar shift=0pt,
            enlarge y limits=0.1,
            ytick distance=1,
            % -----------------------------------------------------------------
            % this is the solution to your problem
            % -----------------------------------------------------------------
            % we want the *original* x value and store it in a macro ...
            visualization depends on={rawx \as \rawx},
            % ... which value should be shown in the `nodes near coords'
            nodes near coords={%
                \pgfmathprintnumber{\rawx}%
            },
            % -----------------------------------------------------------------
            before end axis/.code={
                \draw  ({rel axis cs:0,0} -| {axis cs:0,0})
                    -- ({rel axis cs:0,1} -| {axis cs:0,0})
                ;
            },
        },
    }
\begin{document}
    \begin{tikzpicture}
        \begin{axis}[
            TornadoPlot,
            legend style={at={(0.975,0.25)}},
            % and we want to limit the range of the bars to the axis limits
            restrict x to domain*={
                \pgfkeysvalueof{/pgfplots/xmin}:\pgfkeysvalueof{/pgfplots/xmax}
            },
        ]
            \addplot [fill=green!40] coordinates
                {(-3.5,0) (-16,1) (-17.5,2) (-19,3) (-34,4) (-27,5) (-22,6)};
            \addplot [fill=red!40]   coordinates
                {(4,0) (19,1) (12.5,2) (28.5,3) (34,4) (82,5) (38,6)};
            \legend{upside, downside}
        \end{axis}
    \end{tikzpicture}
\end{document}

위 코드의 결과를 보여주는 이미지

관련 정보