我使用了来自此的 ybar例子除了颜色之外,它完全符合我的要求。
\documentclass[border=0.2cm]{standalone}
% Bar chart drawing library
\usepackage{pgfplots}
\usetikzlibrary{patterns}
\pgfplotsset{compat=1.18}
\begin{tikzpicture}
\begin{axis}[ybar interval, ymax=5,ymin=0, minor y tick num = 3]
\addplot coordinates { (1, 2) (2, 4) (3, 5) (4, 4) (5, 2) (6, 0) };
\end{axis}
\end{tikzpicture}
\end{document}
得到以下图表:
我现在想改变每个条的颜色,但我最初将每个条拆分为单个条的方法\addplot
没有奏效。
有什么想法可以改变颜色吗?
答案1
我觉得这种简单的 TikZ 方式对用户来说更灵活。事实上,其他命令是装饰用的;你只需要一个循环\foreach
\foreach \i/\j/\color in {1/2/cyan,2/4.5/magenta,3/5.1/teal,4/2.5/violet,5/3.5/orange}
\draw[line width=8mm,color=\color] (\i,0)--+(90:\j);
line width=10mm
如果您希望颜色列之间没有间隙,请使用。
\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[gray!30] (0,0) grid[xstep=0] (6,5.5);
\foreach \i in {1,...,5} \path (\i,0) node[below] {$\i$};
\foreach \j in {0,.2,...,5.5} \draw (0,\j)--+(.1,0);
\foreach \j in {0,...,5} \path (0,\j) node[left] {$\j$};
\draw[thick] (0,0) rectangle (6,5.5);
\foreach \i/\j/\color in {1/2/cyan,2/4.5/magenta,3/5.1/teal,4/2.5/violet,5/3.5/orange}
\draw[line width=8mm,color=\color] (\i,0)--+(90:\j);
\end{tikzpicture}
\end{document}
更新:添加每列高度的数字。我发现 TikZ/TeX 不太适应巧合命名[color=\color]
,所以我改为[color=\icolor]
。
\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\begin{tikzpicture}[xscale=1.5]
\draw[gray!30] (0,0) grid[xstep=0] (6,6);
\foreach \j in {0,.2,...,6} \draw (0,\j)--+(.1,0);
\foreach \j in {0,...,5} \path (0,\j) node[left] {$\j$};
\draw[thick] (0,0) rectangle (6,6);
\foreach \i/\j/\icolor in {1/2/cyan,2/4.5/magenta,3/5.1/teal,4/2.5/violet,5/3.5/orange}
\draw[line width=8mm,color=\icolor]
(\i,0) node[below=-4mm,black] {$\i$}
--(\i,\j) node[above=-4mm]{$\j$};
\end{tikzpicture}
\end{document}
答案2
您的初始解决方案是它的工作原理。这是您要寻找的吗:
\documentclass[border=0.2cm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
minor y tick num = 3,
ybar=0cm,
bar width=1cm,
ymin=0,
ymax=7,
ylabel=values,
xtick=data,
xticklabels={My bar chart},
]
\addplot[draw=cyan, fill=cyan] coordinates {(1, 2) };
\addplot[draw=magenta, fill=magenta] coordinates {(1, 4) };
\addplot[draw=green, fill=green] coordinates {(1, 5) };
\addplot[draw=yellow, fill=yellow] coordinates {(1, 4) };
\addplot[draw=gray, fill=gray] coordinates {(1, 3) };
\addplot[draw=orange, fill=orange] coordinates {(1, 1) };
\end{axis}
\end{tikzpicture}
\end{document}}
答案3
灵感来自@onpra7的回答这里,另一个\foreach
循环绘制每个条形图:
\documentclass[border=0.2cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ymin=0, ymax=5.5,
minor y tick num = 3,
]
\foreach \x/\y/\color in {
1/2/cyan,
2/4/magenta,
3/5/green,
4/4/yellow,
5/2/gray,
6/0/orange
} {
\edef\mybar{\noexpand\addplot[fill=\color]
coordinates {(\x-0.5,0) (\x-0.5,\y) (\x+0.5,\y) (\x+0.5,0)} --cycle;
}\mybar
}
\end{axis}
\end{tikzpicture}
\end{document}