Cómo escalar automáticamente un gráfico de barras horizontal (pgfplots)

Cómo escalar automáticamente un gráfico de barras horizontal (pgfplots)

Necesito exportar estadísticas de una base de datos a archivos PDF, con un programa. La base de datos contiene varias pruebas y deben mostrarse como gráficos de barras. Aquí hay un ejemplo:

ingrese la descripción de la imagen aquí

El problema es claro: cuando las etiquetas x son largas, el gráfico sale de la página. Sin embargo, no puedo decir de antemano cuánto durarán las etiquetas. A veces serán simplemente palabras simples. A veces frases de quién.

La pregunta es: ¿cómo calcular el tamaño necesario para las etiquetas y escalar automáticamente el resto del gráfico de barras para que quepa en la página horizontalmente?

\subsection{Irányítási kompetencia}

    %
        \begin{tikzpicture}
\begin{axis}[
        xbar,
            xmin=,
            xmax=61.1111111111,
            width=12cm,
            height={ 1cm + ( 4.0 * 1cm ) },
    symbolic y coords={{Tervezés},{Szervezés},{Döntőképesség},{Ellenőrzés}},
    %ylabel={Irányítási kompetencia}, % This is not really needed, need to save space!
    xlabel={Pontérték \%},
    ytick=data, % Without this, y labels will be written for every "tick". And not for every bar.
    nodes near coords,
    nodes near coords align = {horizontal}
]
\addplot [draw=black, fill=cyan!40!black] coordinates {
    (37.5,{Tervezés})
    (61.1111111111,{Szervezés})
    (31.25,{Döntőképesség})
    (31.25,{Ellenőrzés})

};
\end{axis}
\end{tikzpicture}


%
    %



\subsection{Vezetési kompetencia}

    %
        \begin{tikzpicture}
\begin{axis}[
        xbar,
            xmin=,
            xmax=60.0,
            width=12cm,
            height={ 1cm + ( 11.0 * 1cm ) },
    symbolic y coords={{Megbízhatóság},{Stressztűrés},{Figyelemkoncentráció},{Szabálykövetés},{Önkontroll},{Holisztikus gondolkodás},{Analitikus gondolkodás},{Szervezőkészség},{Alkalmazkodó képesség},{Rendszerező, struktúráló képesség},{Vezetői szerep}},
    %ylabel={Vezetési kompetencia}, % This is not really needed, need to save space!
    xlabel={Pontérték \%},
    ytick=data, % Without this, y labels will be written for every "tick". And not for every bar.
    nodes near coords,
    nodes near coords align = {horizontal}
]
\addplot [draw=black, fill=cyan!40!black] coordinates {
    (55.0,{Megbízhatóság})
    (60.0,{Stressztűrés})
    (30.0,{Figyelemkoncentráció})
    (33.3333333333,{Szabálykövetés})
    (35.0,{Önkontroll})
    (35.0,{Holisztikus gondolkodás})
    (38.8888888889,{Analitikus gondolkodás})
    (59.0909090909,{Szervezőkészség})
    (54.1666666667,{Alkalmazkodó képesség})
    (40.9090909091,{Rendszerező, struktúráló képesség})
    (36.3636363636,{Vezetői szerep})

};
\end{axis}
\end{tikzpicture}

ingrese la descripción de la imagen aquí

ACTUALIZACIÓN: También intenté colocar toda la imagen de tizk, \resizebox{\linewidth}{!}{...}pero también se escala verticalmente, y eso es malo, porque la cantidad de barras en el gráfico varía. Entonces, por "escalar" quiero decir: especificar el ancho del gráfico. Lo que no quiero decir es: "escalar el gráfico que ya se representó".

Respuesta1

No me gustó el resultado \resizeboxporque las etiquetas se distorsionaron... así que pensé que cambiarlas widthsería mejor. Puede que haya soluciones más simples (usando parámetros que no pude encontrar), pero aquí hay una. He utilizado el showframepaquete para comprobar los márgenes.

ingrese la descripción de la imagen aquí

\documentclass{article}

\usepackage{t1enc}
\usepackage{pgfplots}
\usepackage[margin=1cm]{geometry} % demo only

\usepackage{varwidth}
\usepackage{environ}
%\usepackage{showframe}

\newsavebox{\mybox}
\newlength{\mylength}
\NewEnviron{fittedplot}[1]{%
    \begin{lrbox}{\mybox}\begin{tikzpicture}\begin{axis}[#1,width=\textwidth]\BODY\end{axis}\end{tikzpicture}\end{lrbox}%
    \setlength{\mylength}{-\the\wd\mybox}%
    \addtolength{\mylength}{2\textwidth}%
    \begin{tikzpicture}\begin{axis}[#1,width=\mylength]\BODY\end{axis}\end{tikzpicture}%
}

\begin{document}

\noindent
\begin{fittedplot}{
    xbar,
    xmin=,
    xmax=60.0,
    height={ 1cm + ( 11.0 * 1cm ) },
    symbolic y coords={{Megbízhatóság},{Stressztűrés},{Figyelemkoncentráció},{Szabálykövetés},{Önkontroll},{Holisztikus gondolkodás},{Analitikus gondolkodás},{Szervezőkészség},{Alkalmazkodó képesség},{Rendszerező, struktúráló képesség},{Vezetői szerep}},
    %ylabel={Vezetési kompetencia}, % This is not really needed, need to save space!
    xlabel={Pontérték \%},
    ytick=data, % Without this, y labels will be written for every "tick". And not for every bar.
    nodes near coords,
    nodes near coords align = {horizontal}}
\addplot [draw=black, fill=cyan!40!black] coordinates {
    (55.0,{Megbízhatóság})
    (60.0,{Stressztűrés})
    (30.0,{Figyelemkoncentráció})
    (33.3333333333,{Szabálykövetés})
    (35.0,{Önkontroll})
    (35.0,{Holisztikus gondolkodás})
    (38.8888888889,{Analitikus gondolkodás})
    (59.0909090909,{Szervezőkészség})
    (54.1666666667,{Alkalmazkodó képesség})
    (40.9090909091,{Rendszerező, struktúráló képesség})
    (36.3636363636,{Vezetői szerep})
};
\end{fittedplot}

\end{document}

información relacionada