
Недавно я работал над исследовательской работой, посвященной экономическим структурным изменениям, и один из самых простых способов наглядно показать это явление — каскадные диаграммы. Сначала я решил использовать Excel для ее создания, и вот что получилось (это только часть диаграммы, так как я просто хочу дать вам беглый взгляд):
Диаграмма выглядит хорошо, но поскольку я всегда предпочитал LaTeX, я решил попробовать построить ее с помощью пакета tikz
. Однако было трудно найти подходящую среду, чтобы сделать это красиво и автоматически. На данный момент я использовал чистые координаты для построения диаграммы. Я использовал этот код:
\documentclass[border = .5cm .5cm .5cm .5cm]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{tikz} % tikzpicture
\begin{document}
\begin{tikzpicture}[xscale = 5]
% Rectangles
\path[fill = blue!70] (0,0cm) rectangle (0.3450288,0.20426);
\path[fill = green!50] (0.3450288,0) rectangle (0.5766886,0.2539946);
\path[fill = cyan] (0.5766886,0) rectangle (0.7382995,0.3101311);
\path[fill = teal] (0.7382995,0) rectangle (0.8515251,0.4869684);
\path[fill = brown] (0.8515251,0) rectangle (0.9007586,0.4881487);
\path[fill = pink] (0.9007586,0) rectangle (0.9366190,0.6492083);
\path[fill = orange] (0.9366190,0) rectangle (0.9417933,0.8690585);
\path[fill = violet] (0.9417933,0) rectangle (0.9483419,0.9971954);
\path[fill = magenta!50] (0.9483419,0) rectangle (0.9751932,1.594287);
\path[fill = black!70] (0.9751932,0) rectangle (0.9953494,1.837054);
\path[fill = red!70] (0.9953494,0) rectangle (1,3.309693);
% Axis
\draw[<->] (0,3.5) -- (0,0) -- (1.05,0);
\foreach \x in {0,0.5,1.0,1.5,2.0,2.5,3.0,3.5}
\path (0,\x) node[left]{\tiny $\x$};
\node[rotate = 90] at (-0.15,1.75){\tiny\parbox{4cm}{\centering Productividad por sector como proporción de la productividad media}};
\node at (0.5,-0.3){\tiny\parbox{4cm}{\centering Proporción del empleo capturado}};
% Labels
\path[fill = blue!70] (0,-0.7) rectangle (0.02,-0.6);
\node[right] at (0.01,-0.67) {\tiny agsp};
\path[fill = green!50] (0,-0.9) rectangle (0.02,-0.8);
\node[right] at (0.01,-0.87) {\tiny chre};
\path[fill = cyan] (0,-1.1) rectangle (0.02,-1);
\node[right] at (0.01,-1.07) {\tiny serp};
% -----
\path[fill = teal] (0.2,-0.7) rectangle (0.22,-0.6);
\node[right] at (0.21,-0.67) {\tiny indm};
\path[fill = brown] (0.2,-0.9) rectangle (0.22,-0.8);
\node[right] at (0.21,-0.87) {\tiny const};
\path[fill = pink] (0.2,-1.1) rectangle (0.22,-1);
\node[right] at (0.21,-1.07) {\tiny trco};
% -----
\path[fill = orange] (0.4,-0.7) rectangle (0.42,-0.6);
\node[right] at (0.41,-0.67) {\tiny exmi};
\path[fill = violet] (0.4,-0.9) rectangle (0.42,-0.8);
\node[right] at (0.41,-0.87) {\tiny eaal};
\path[fill = magenta] (0.4,-1.1) rectangle (0.42,-1);
\node[right] at (0.41,-1.07) {\tiny adpu};
% -----
\path[fill = black!70] (0.6,-0.7) rectangle (0.62,-0.6);
\node[right] at (0.61,-0.67) {\tiny alqu};
\path[fill = red!70] (0.6,-0.9) rectangle (0.62,-0.8);
\node[right] at (0.61,-0.87) {\tiny sifc};
\end{tikzpicture}
\end{document}
С помощью этого кода мне удалось сгенерировать следующее:
Что выглядит относительно неплохо, но я бы предпочел сгенерировать его более автоматическим и менее болезненным способом. Может ли кто-нибудь порекомендовать мне другой подход к созданию диаграммы? (Я также пробовал комбинировать пакет
tikz
с pgfplots
пакетом, но не смог найти подходящий вариант).
решение1
Мне удалось сгенерировать каскадную диаграмму, используя const plot
и ybar interval
опции среды axis
. Мне также удалось добавить отдельные записи легенды для каждого бара с area legend
опцией команды \addplot
. Вот минимальный пример:
\documentclass[margin=0.3cm]{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat = newest}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
title = Cascade Chart in \LaTeX,
ylabel = Productivity,
xlabel = Employment share (\%),
xmin = 0, xmax = 1,
ymin = 0, ymax = 10,
legend entries = {A, B, C},
legend pos = outer north east,
]
\addplot[
const plot,
ybar interval,
fill = green,
area legend
] coordinates {(0,2) (0.6,2)};
\addplot[
const plot,
ybar interval,
fill = blue,
area legend
] coordinates {(0.6,4) (0.9,4)};
\addplot[
const plot,
ybar interval,
fill = red,
area legend
] coordinates {(0.9,9) (1,9)};
\end{axis}
\end{tikzpicture}
\end{document}
Результат должен выглядеть так: