![带有多色条形和标签的条形图](https://linux22.com/image/474236/%E5%B8%A6%E6%9C%89%E5%A4%9A%E8%89%B2%E6%9D%A1%E5%BD%A2%E5%92%8C%E6%A0%87%E7%AD%BE%E7%9A%84%E6%9D%A1%E5%BD%A2%E5%9B%BE.png)
我想创建一个带有多色条形的条形图。条形图应显示每个部分的长度。我的问题是,在第一部分中,数字总是位于条形图之前,而不是在条形图上。
我的代码是这样的:
\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}