我正在尝试绘制分组条形图,但在顶部添加点以表示结果中的异常值。
目前我有:
\begin{figure}[]
\begin{tikzpicture}
\begin{axis}[
width = 1*\textwidth,
height = 4.5cm,
major x tick style = transparent,
ybar=1*\pgflinewidth,
bar width=13pt,
symbolic x coords={A,B,C,D},
xtick = data,
enlarge x limits=0.25,
ymax=15,
ymin=0,
legend cell align=left,
legend style={
at={(1,1.05)},
anchor=south east,
column sep=1ex
}
]
\addplot[style={fill=red,mark=none}]
coordinates {(A, 4.44) (B,0.1) (C,4.37) (D,4.07)};
\addplot[style={fill=green,mark=none}]
coordinates {(A, 0.4) (B,0.8) (C,0.3) (D,0.5)};
\addplot[style={fill=blue,mark=none}]
coordinates {(A, 0.2) (B,0) (C,0.9) (D,0.8)};
\addplot[style={fill=yellow,mark=none}]
coordinates {(A, 9.59) (B,0.2) (C,8.86) (D,8.62)};
\draw node[fill,circle,scale=0.5]{} (axis cs:A,7);
\draw node[fill,circle,scale=0.5]{} (axis cs:B,11);
\draw node[fill,circle,scale=0.5]{} (axis cs:C,3);
\draw node[fill,circle,scale=0.5]{} (axis cs:D,12);
\legend{C1,C2,C3,C4}
\end{axis}
\end{tikzpicture}
\end{figure}
这样可以绘制分组图等,但“点”始终出现在 (0,0) 位置,忽略相对坐标。参见下图,它靠近“A”。理想情况下,我想将这样的点放置在图表中每个条形上方。我该如何正确指定坐标?
答案1
如果要在特定条形上方添加单个数据点,可以使用
\draw (axis cs:A,7) node [xshift=-1.5*\pgfkeysvalueof{/pgf/bar width}, fill,circle,scale=0.5]{};
红色条形图使用xshift=-1.5*\pgfkeysvalueof{/pgf/bar width}
,绿色条形图使用xshift=-0.5*\pgfkeysvalueof{/pgf/bar width}
,依此类推。
\documentclass{article}
\usepackage{pgfplots, pgfplotstable}
\begin{document}
\pgfplotstableread{
Name C1 C2 C3 C4
A 4.44 0.4 0.2 9.59
B 0.10 0.8 0.0 0.2
C 4.37 0.3 0.9 8.86
D 4.07 0.5 0.8 8.62
}\datatable
\begin{figure}[]
\begin{tikzpicture}
\begin{axis}[
width = 1*\textwidth,
height = 4.5cm,
major x tick style = transparent,
ybar=0,
bar width=13pt,
symbolic x coords={A,B,C,D},
xtick = data,
enlarge x limits=0.25,
ymax=15,
ymin=0,
legend cell align=left,
legend style={
at={(1,1.05)},
anchor=south east,
column sep=1ex
}
]
\addplot[style={fill=red,mark=none}]
coordinates {(A, 4.44) (B,0.1) (C,4.37) (D,4.07)};
\addplot[style={fill=green,mark=none}]
coordinates {(A, 0.4) (B,0.8) (C,0.3) (D,0.5)};
\addplot[style={fill=blue,mark=none}]
coordinates {(A, 0.2) (B,0) (C,0.9) (D,0.8)};
\addplot[style={fill=yellow,mark=none}]
coordinates {(A, 9.59) (B,0.2) (C,8.86) (D,8.62)};
\legend{C1,C2,C3,C4}
\draw (axis cs:A,7) node [xshift=-1.5*\pgfkeysvalueof{/pgf/bar width}, fill,circle,scale=0.5]{} ;
\draw (axis cs:C,1.5) node [xshift=0.5*\pgfkeysvalueof{/pgf/bar width}, fill,circle,scale=0.5]{} ;
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}
如果您只想突出显示特定的条形图,则可以使用该nodes near coords
功能,该功能可用于将节点放置在数据点附近。当使用\addplot coordinates
(而不是使用表格)提供数据时,您只需[\textbullet]
在要突出显示的坐标后添加即可。请注意,您还需要在选项point meta=explicit symbolic
中设置axis
,否则nodes near coords
会创建包含条形图 y 值的标签。
与“手动”将 TikZ 节点放置在所需位置相比,这种方法的优点是使用更少的代码,并且更容易维护,因为您可以与数据一起定义标记,而不必两次输入坐标值。
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{figure}[]
\begin{tikzpicture}
\begin{axis}[
width = 1*\textwidth,
height = 4.5cm,
major x tick style = transparent,
ybar=1*\pgflinewidth,
bar width=13pt,
symbolic x coords={A,B,C,D},
xtick = data,
enlarge x limits=0.25,
ymax=15,
ymin=0,
legend cell align=left,
legend style={
at={(1,1.05)},
anchor=south east,
column sep=1ex
},
nodes near coords,
point meta=explicit symbolic
]
\addplot[style={fill=red,mark=none}]
coordinates {(A, 4.44)[\textbullet] (B,0.1) (C,4.37) (D,4.07)};
\addplot[style={fill=green,mark=none}]
coordinates {(A, 0.4) (B,0.8) (C,0.3)[\textbullet] (D,0.5)};
\addplot[style={fill=blue,mark=none}]
coordinates {(A, 0.2) (B,0) (C,0.9) (D,0.8)};
\addplot[style={fill=yellow,mark=none}]
coordinates {(A, 9.59) (B,0.2) (C,8.86) (D,8.62) [\textbullet]};
\legend{C1,C2,C3,C4}
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}
答案2
我不确定我是否明白您到底想要什么圆圈,但我会提供这个解决方案来开始对话,因为没有其他人接受。
这不起作用tikz
,我确信tikz
解决方案是您想要的,但在没有解决方案的情况下,\stackinset
宏会将插入图(文本或图形)覆盖在对象(文本或图形)上。我以一种我认为可能满足您需求的方式覆盖了一些项目符号,但如果我错过了,请澄清。我不得不添加%
到空白行,因为\stackinset
这不是long
命令。
多个插图是通过嵌套实现的,正如我在 MWE 中展示的那样。缺点是您必须为插图位置指定纸张(而不是图形)坐标。通过使用{c}
和{b}
参数,插图坐标的中心底部是相对于图像的中心底部计算的。
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{stackengine}[2013-09-11]
\begin{document}
\begin{figure}[]
\stackinset{c}{-3.92cm}{b}{1.52cm}{$\bullet$}{%
\stackinset{c}{1.22cm}{b}{0.72cm}{$\bullet$}{%
\begin{tikzpicture}
\begin{axis}[
width = 1*\textwidth,
height = 4.5cm,
major x tick style = transparent,
ybar=1*\pgflinewidth,
bar width=13pt,
symbolic x coords={A,B,C,D},
xtick = data,
enlarge x limits=0.25,
ymax=15,
ymin=0,
legend cell align=left,
legend style={
at={(1,1.05)},
anchor=south east,
column sep=1ex
}
]
\addplot[style={fill=red,mark=none}]
coordinates {(A, 4.44) (B,0.1) (C,4.37) (D,4.07)};
%
\addplot[style={fill=green,mark=none}]
coordinates {(A, 0.4) (B,0.8) (C,0.3) (D,0.5)};
%
\addplot[style={fill=blue,mark=none}]
coordinates {(A, 0.2) (B,0) (C,0.9) (D,0.8)};
%
\addplot[style={fill=yellow,mark=none}]
coordinates {(A, 9.59) (B,0.2) (C,8.86) (D,8.62)};
%
% \draw node[fill,circle,scale=0.5]{} (axis cs:A,7);
% \draw node[fill,circle,scale=0.5]{} (axis cs:B,11);
% \draw node[fill,circle,scale=0.5]{} (axis cs:C,3);
% \draw node[fill,circle,scale=0.5]{} (axis cs:D,12);
%
\legend{C1,C2,C3,C4}
\end{axis}
\end{tikzpicture}%
}}
\end{figure}
\end{document}