Добавить пользовательскую легенду в bchart

Добавить пользовательскую легенду в bchart

Я пытаюсь вставить пользовательскую легенду в столбчатую диаграмму, например, такую:

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

К сожалению, я вообще не могу найти примеры легенд, используемых в этом типе диаграмм. Возможно ли это?

Мой код:

\documentclass{article}
\usepackage{bchart}
\begin{document}
\begin{bchart}[steps={20,40,60,80,100,120, 140},max=140]
\bcbar[label=Median]{132} \bcskip{5pt} % you can set the seperation between bars in the argument of \bcskip
\bcbar[label=Amplitudenmaximum]{116} \bcskip{5pt}
\bcbar[label=Effektivwert]{70} \bcskip{5pt}
\bcbar[label=Standardabweichung]{66} \bcskip{5pt}
\bcbar[label=Schiefe]{60} \bcskip{5pt}
\bcbar[label=Standardabweichung, color=black!50]{59} \bcskip{5pt}
\bcbar[label=Varianz]{57} \bcskip{5pt}
\bcbar[label=Schiefe, color=black!50]{54} \bcskip{5pt}
\bcbar[label=Gleichrichtswert]{52} \bcskip{5pt}
\bcbar[label=Amplitudenminimum]{50} \bcskip{-2.1pt}
\bcxlabel{Anzahl von Anwendungen}
\end{bchart}
\end{document} 

решение1

Так как bchartиспользует tikz, последний может быть использован для рисования легенды. Чтобы выровнять легенду по оси x справа, требуются некоторые вычисления. Также код должен учитывать тексты разной длины.

В коде ниже определен макрос \bclegendс тремя аргументами. Первый необязателен и задает длину полосы в легенде. Значение по умолчанию — 10 мм. Второй задает расстояние между линиями легенды, которое также используется как расстояние между осью x и рамкой легенды. В третьем аргументе задаются цвета и тексты. Они должны быть в форме color1/text1,color2/text2,...с одной парой на строку.

Расстояние между линиями легенды и рамкой определяется в \bclldist. С помощью \renewcommand{\bclldist}{<some length>}(после кода) это можно изменить. Значение по умолчанию — 1 мм.

\documentclass{article}
\usepackage{bchart}

\usetikzlibrary{fit}

\makeatletter
\newdimen\legendxshift
\newdimen\legendyshift
\newcount\legendlines
% distance of frame to legend lines
\newcommand{\bclldist}{1mm}
\newcommand{\bclegend}[3][10mm]{%
    % initialize
    \legendxshift=0pt\relax
    \legendyshift=0pt\relax
    \xdef\legendnodes{}%
    % get width of longest text and number of lines
    \foreach \lcolor/\ltext [count=\ll from 1] in {#3}%
        {\global\legendlines\ll\pgftext{\setbox0\hbox{\bcfontstyle\ltext}\ifdim\wd0>\legendxshift\global\legendxshift\wd0\fi}}%
    % calculate xshift for legend; \bcwidth: from bchart package; \bclldist: from node frame, inner sep=\bclldist (see below)
    % \@tempdima: half width of bar; 0.72em: inner sep from text nodes with some manual adjustment
    \@tempdima#1\@tempdima0.5\@tempdima
    \pgftext{\bcfontstyle\global\legendxshift\dimexpr\bcwidth-\legendxshift-\bclldist-\@tempdima-0.72em}
    % calculate yshift; 5mm: heigt of bar
    \legendyshift\dimexpr5mm+#2\relax
    \legendyshift\legendlines\legendyshift
    % \bcpos-2.5mm: from bchart package; \bclldist: from node frame, inner sep=\bclldist (see below)
    \global\legendyshift\dimexpr\bcpos-2.5mm+\bclldist+\legendyshift
    % draw the legend
    \begin{scope}[shift={(\legendxshift,\legendyshift)}]
    \coordinate (lp) at (0,0);
    \foreach \lcolor/\ltext [count=\ll from 1] in {#3}%
    {
        \node[anchor=north, minimum width=#1, minimum height=5mm,fill=\lcolor] (lb\ll) at (lp) {};
        \node[anchor=west] (l\ll) at (lb\ll.east) {\bcfontstyle\ltext};
        \coordinate (lp) at ($(lp)-(0,5mm+#2)$);
        \xdef\legendnodes{\legendnodes (lb\ll)(l\ll)}
    }
    % draw the frame
    \node[draw, inner sep=\bclldist,fit=\legendnodes] (frame) {};
    \end{scope}
}
\makeatother

\begin{document}
\begin{bchart}[steps={20,40,60,80,100,120, 140},max=140]
\bcbar[label=Median]{132} \bcskip{5pt} % you can set the seperation between bars in the argument of \bcskip
\bcbar[label=Amplitudenmaximum]{116} \bcskip{5pt}
\bcbar[label=Effektivwert]{70} \bcskip{5pt}
\bcbar[label=Standardabweichung]{66} \bcskip{5pt}
\bcbar[label=Schiefe]{60} \bcskip{5pt}
\bcbar[label=Standardabweichung, color=black!50]{59} \bcskip{5pt}
\bcbar[label=Varianz]{57} \bcskip{5pt}
\bcbar[label=Schiefe, color=black!50]{54} \bcskip{5pt}
\bcbar[label=Gleichrichtswert]{52} \bcskip{5pt}
\bcbar[label=Amplitudenminimum]{50} \bcskip{-2.1pt}
\bcxlabel{Anzahl von Anwendungen}
\bclegend{5pt}{black!50/Text AA,\bcbarcolor/Text B}
\end{bchart}
\end{document} 

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

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