Как автоматически масштабировать горизонтальную гистограмму (pgfplots)

Как автоматически масштабировать горизонтальную гистограмму (pgfplots)

Мне нужно экспортировать статистику из базы данных в файлы PDF с помощью программы. База данных содержит несколько тестов, и их нужно отобразить в виде столбчатых диаграмм. Вот пример:

введите описание изображения здесь

Проблема ясна: когда xlabels длинные, то диаграмма выходит за пределы страницы. Однако я не могу заранее сказать, насколько длинными будут метки. Иногда это будут просто простые слова. Иногда предложения whoe.

Вопрос в следующем: как рассчитать размер, необходимый для надписей, и автоматически масштабировать остальную часть гистограммы, чтобы она поместилась на странице по горизонтали?

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

введите описание изображения здесь

ОБНОВЛЕНИЕ: Я также пытался поместить весь tizkpicture \resizebox{\linewidth}{!}{...}, но он также масштабируется по вертикали, и это плохо, потому что количество столбцов в диаграмме меняется. Так что под «масштабированием» я подразумеваю: указать ширину диаграммы. Я не имею в виду: «масштабировать диаграмму, которая уже была отрисована».

решение1

Мне не понравился результат, \resizeboxпотому что метки исказились... поэтому я подумал, что widthлучше изменить. Возможно, есть более простые решения (с использованием параметров, которые я не смог найти), но вот одно из них. Я использовал пакет showframeдля проверки полей.

введите описание изображения здесь

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

Связанный контент