Como dimensionar automaticamente um gráfico de barras horizontal (pgfplots)

Como dimensionar automaticamente um gráfico de barras horizontal (pgfplots)

Preciso exportar estatísticas de um banco de dados para arquivos PDF, com um programa. O banco de dados contém vários testes e eles precisam ser exibidos como gráficos de barras. Aqui está um exemplo:

insira a descrição da imagem aqui

O problema é claro: quando os xlabels são longos, o gráfico sai da página. No entanto, não posso dizer com antecedência quanto tempo durarão os rótulos. Às vezes serão apenas palavras simples. Às vezes, quem sentenças.

A questão é: como calcular o tamanho necessário para os rótulos e dimensionar automaticamente o restante do gráfico de barras para caber horizontalmente na página?

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

insira a descrição da imagem aqui

ATUALIZAÇÃO: Também tentei colocar toda a imagem tizk, \resizebox{\linewidth}{!}{...}mas ela também é dimensionada verticalmente, o que é ruim, porque o número de barras no gráfico varia. Então, por "escalar" quero dizer: especificar a largura do gráfico. O que não quero dizer é: "escalar o gráfico que já foi renderizado".

Responder1

Não gostei do resultado \resizeboxporque os rótulos ficaram distorcidos... então pensei que mudar widthseria melhor. Pode haver soluções mais simples (usando parâmetros que não consegui encontrar), mas aqui está uma. Usei o showframepacote para verificar as margens.

insira a descrição da imagem aqui

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

informação relacionada