Ich muss mit einem Programm Statistiken aus einer Datenbank in PDF-Dateien exportieren. Die Datenbank enthält mehrere Tests und diese müssen als Balkendiagramme angezeigt werden. Hier ist ein Beispiel:
Das Problem ist klar: Wenn die xlabels lang sind, dann geht das Diagramm über die Seite hinaus. Allerdings kann ich nicht im Voraus sagen, wie lang die Labels sein werden. Manchmal sind es nur einfache Wörter. Manchmal ganze Sätze.
Die Frage ist: Wie berechnet man die für die Beschriftungen benötigte Größe und skaliert den Rest des Balkendiagramms automatisch, damit es horizontal auf die Seite passt?
\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}
UPDATE: Ich habe auch versucht, das ganze Tizkpicture einzufügen \resizebox{\linewidth}{!}{...}
, aber es skaliert auch vertikal, und das ist schlecht, weil die Anzahl der Balken im Diagramm variiert. Mit „Skalieren“ meine ich also: die Breite des Diagramms festlegen. Was ich nicht meine, ist: „das bereits gerenderte Diagramm skalieren“.
Antwort1
Mir gefiel die Ausgabe nicht, \resizebox
weil die Beschriftungen verzerrt waren... also dachte ich, es width
wäre besser, das zu ändern. Es gibt vielleicht einfachere Lösungen (mit Parametern, die ich nicht finden konnte), aber hier ist eine. Ich habe das showframe
Paket verwendet, um die Ränder zu überprüfen.
\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}