带有多色条形和标签的条形图

带有多色条形和标签的条形图

我想创建一个带有多色条形的条形图。条形图应显示每个部分的长度。我的问题是,在第一部分中,数字总是位于条形图之前,而不是在条形图上。

我的代码是这样的:

\begin{tikzpicture}[rotate=-90]\
\begin{axis}[ \
    ybar stacked,\
    nodes near coords={\pgfmathprintnumber\pgfplotspointmeta},\
    point meta=rawy,\
    axis lines=none,\
    bar width=1cm,\
    width=20cm,\
    height=12cm,\
    x=7cm, \
    nodes near coords style={rotate=90, anchor=west}\
] 
\addplot coordinates{(0,148) }; \
\addplot coordinates{(0,1)  }; \
\addplot coordinates{(0,361)  }; \
\end{axis}\
\end{tikzpicture}

这就是它的样子

但我希望它看起来像这样:

在此处输入图片描述

答案1

这是实现此操作的方法。由于您没有提供前言,因此以下是在 Tikz 中实现此操作的方法:

  • 将条形视为线条,线条需要稍微粗一些
  • 根据需要手动计算所需长度(或使用 calc-lib)
  • 将节点(不带\)放在路径结束于;
  • 提供并微调有用的样式

请在手册

结果

\documentclass[10pt,border=3mm]{standalone}
\usepackage{tikz}

\begin{document}
 \begin{tikzpicture}[
    lw/.style={line width=12mm},
    rb/.style={lw,red },
    gb/.style={lw,black!100!blue!60},
    wh/.style={white,font={\bf\sffamily\LARGE}},
 ]
    \draw[rb] (0,0)             -- node[wh]{148} (-5.32,0);
    \draw[gb] (0,0) node[wh]{1} -- node[wh]{361} (14.4 ,0);
 \end{tikzpicture}
\end{document}

稍微重构一下

重构是逐步改变和扩展现有代码的步骤,从“什么东西在那里“ 到 ”将会变成什么样“。通常你至少要包含:

  • 通过/失败测试(此处进行编译和目视检查)
  • 概括
  • 预期

如果您使用 tikzlibrary,calc您需要:

  • 定义一个单位长度,或最大值,或者任何你喜欢或有用的
  • 切换到数学模式进行坐标计算(见13.5 章

我的预期是:

  • 中间的“1”是任意的(即不言而喻,如果它可以是堆叠的 10 或其他)
  • 所以把它搬出去
  • 准备其余部分以进行参数传递,例如通过\pic

(同一张截图)

\documentclass[10pt,border=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}           % <<< NEW

% ~~~ define unit ~~~~~~~~
\newcommand\myunit[0]{0.04}     % <<< NEW

\begin{document}
 \begin{tikzpicture}[
    lw/.style={line width=12mm},
    rb/.style={lw,red },
    gb/.style={lw,black!90!teal!60},
    wh/.style={white,font={\bf\sffamily\LARGE}},
 ]
    \draw[rb] (0,0)     -- node[wh]{148} ($\myunit*(-148,0)$);
    \draw[gb] (0,0)     -- node[wh]{361} ($\myunit*( 361,0)$);
    \node[wh] at (0,0) {1};
 \end{tikzpicture}
\end{document}

答案2

这是另一种解决方案,其中图表的大小保持不变,但缩放比例会根据数字“自动”调整。%这是输入数据的地方

\def\a{148}\\
\def\b{20}\\
\def\c{361}\\
%size of the diagram\\
\def\gl{12}\\
%All data entered will be added together here\\
\FPeval{\ga}{clip(round(\a + \b + \c , 2))}\\
% hier wird die Länge durch die addierten Daten geteilt\\
\FPeval{\ml}{clip(round(\gl / \ga , 2))}\\
% Here the lengths of the respective section are calculated\\
\FPeval{\la}{clip(round(\ml * \a , 2))}\\
\FPeval{\lb}{clip(round(\ml * \b + \la, 2))}\\
\FPeval{\lc}{clip(round(\ml * \c +\lb, 2))}\\  
\begin{tikzpicture}[
lw/.style={line width=12mm},\\
rb/.style={lw, red},\\
g/.style={lw, gray},\\
dg/.style={lw, darkgray},\\
wh/.style={white,font={\bf\sffamily\large}},]
% The calculated coordinates are automatically entered here \\
%1
\draw[rb] ( 0, 0)             -- node[wh]{\a} (\la ,0);\\
%2
\draw[g] (\la,0)             -- node[wh]{\b} (\lb ,0);\\
%3
\draw[dg] (\lb,0)             -- node[wh]{\c} (\lc ,0);\\
% If the number at b is single-digit you should include 2 and 3 in a comment % and remove the % sign at 4\\
%4
%\draw[gb] (\la,0) node[wh]{\b} -- node[wh]{\c} (\lc ,0);
\end{tikzpicture}

相关内容