Crear un diagrama de tornado con PGFPlots y forzar una ruptura en una de las barras horizontales

Crear un diagrama de tornado con PGFPlots y forzar una ruptura en una de las barras horizontales

Para mostrar un análisis de sensibilidad quiero producir unTrama de tornado. En el gráfico se compara un valor de caso base específico con los valores producidos después de cambiar los parámetros en el modelo. Empecé desde estoejemplo. Con esto pude conseguir este 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}

Sin embargo, una de las barras (82, 5) tiene un valor x positivo que está fuera del rango del dominio del gráfico. ¿Puedo restringir la longitud de esa barra y forzar una pausa, sin dejar de mostrar el valor original de x? He vistoejemplospara gráficos de barras verticales, pero hasta ahora no he podido reproducir esto para mi gráfico de tornado.

Respuesta1

Sí tu puedes. Para obtener detalles sobre cómo hacerlo, eche un vistazo a los comentarios en el código.

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

imagen que muestra el resultado del código anterior

información relacionada