注释分组条形图

注释分组条形图

我正在尝试绘制分组条形图,但在顶部添加点以表示结果中的异常值。

目前我有:

    \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}

在此处输入图片描述

相关内容