Вертикальное выравнивание и масштабирование гистограммы

Вертикальное выравнивание и масштабирование гистограммы

У меня проблемы с вертикальным выравниванием моей столбчатой ​​диаграммы. Я начал использовать одну xbar-диаграмму для своих данных, но она выглядела ужасно, так как один элемент очень большой, а другой очень маленький. Поэтому у меня возникла идея сделать несколько диаграмм для каждого элемента, но они не очень выравниваются. Это первая версия, в которой масштабирование катастрофическое. Я хочу иметь возможность сравнивать разные графики.

Если я попытаюсь создать несколько диаграмм XBar, они не будут выровнены.

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

\documentclass{report}
\usepackage{pgfplots}
\usepackage{tikz}
\begin{document}
\begin{figure}
\begin{tikzpicture} 
\begin{axis}[tickwidth = 0pt,xbar, xmin=0, width=12cm, height=3.5cm, enlarge y limits=0.5, symbolic y coords={no,yes}, ytick=data, nodes near coords,y axis line style = { opacity = 0 },
   axis x line       = none ] 
\addplot coordinates {(1000000,yes) (2000000,no)}; 
\addplot coordinates {(4000000,yes) (1000000,no)}; 
\end{axis} 
\end{tikzpicture}
\begin{tikzpicture} 
\begin{axis}[  tickwidth= 0pt,xbar, xmin=0, width=12cm, height=3.5cm, enlarge y limits=0.5, symbolic y coords={noooooo,yeeeeees}, ytick=data, nodes near coords,y axis line style = { opacity = 0 },
   axis x line       = none ] 
\addplot coordinates {(3,noooooo) (7,yeeeeees)};
\addplot coordinates {(30,noooooo) (1,yeeeeees)}; 
\end{axis} 
\end{tikzpicture}
\end{figure}

\begin{figure}
\begin{tikzpicture} 
\begin{axis}[  tickwidth= 0pt,xbar, xmin=0, enlarge y limits=0.5, symbolic y coords={noooooo,yeeeeees, yes, no}, ytick=data, nodes near coords,y axis line style = { opacity = 0 },
   axis x line       = none ] 
\addplot coordinates {(3,noooooo) (7,yeeeeees) (1000000,yes) (2000000,no)};
\addplot coordinates {(30,noooooo) (1,yeeeeees)(4000000,yes) (1000000,no)}; 
\end{axis} 
\end{tikzpicture}
\end{figure}
\end{document}

решение1

Я думаю, самый простой способ выровнять графики по вертикали — это просто воспользоваться библиотекой groupplots.

(Обратите внимание, что в настоящее время, похоже, возникает ошибка при symbolic coordsиспользовании в groupplot. Вот почему мне пришлось использовать другой подход для предоставления данных. И поскольку я в любом случае был «вынужден» переформулировать данные, я также переключил их с coordinatesна table, который (к тому же) гораздо более гибок.)

Подробную информацию смотрите в комментариях к коду.

% used PGFPlots v1.16
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
    % load the `groupplots` library
    \usepgfplotslibrary{groupplots}
\begin{document}
\begin{tikzpicture}
    \begin{groupplot}[
        group style={
            % define `groupplot` size (2 vertical plots) ...
            group size=1 by 2,
            % ... and the distance between the plots
            vertical sep=5mm,
        },
        % (here are your options which are in common for all plots)
        width=12cm,
        height=3.5cm,
        tickwidth=0pt,
        xbar,
        xmin=0,
        enlarge y limits={abs=0.5},     % <-- (adapted)
        ytick=data,
        nodes near coords,
        y axis line style={opacity=0},
        axis x line=none,
        legend style={
            % position the legend below the plot
            at={(0.0,-0.1)},
            anchor=north west,
            % (add the rest of style you want to use here)
        },
        % use the coordinate index for the y value
        % (which is needed after restating the data `coordinates` to a `table`)
        table/y expr={\coordindex},
    ]
    % start the first plot
    \nextgroupplot[
        % names to be stated as `yticklabels`
        % (which were before the `symbolic y coords`)
        yticklabels={no,yes},
    ]
        % restated data from `coordinates` to `table` which is much simpler
        % (one could also combine all data in a single data file and call
        %  different columns from that here)
        \addplot table {
            1000000
            2000000
        };
        \addplot table {
            4000000
            1000000
        };
    \nextgroupplot[yticklabels={noooooo,yeeeeees}]
        \addplot table {
            3
            7
        };
        \addplot table {
            30
            1
        };
        % add the legend entries to the last `\nextgroupplot`
        \legend{a,b}
    \end{groupplot}
\end{tikzpicture}
\end{document}

изображение, показывающее результат кода выше

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