如何在 pgfplot 中标记一个点并确保其可见(在图的顶部)?

如何在 pgfplot 中标记一个点并确保其可见(在图的顶部)?

最近,我为维基百科用 TikZ 制作了以下图片(参见文件

在此处输入图片描述

我想标记绿点,就像这里所做的那样:

在此处输入图片描述

我尝试了几种不同的方法,但无论我做什么,文本总是在图表下方。我怎样才能用坐标标记绿点?

平均能量损失

TeX

\documentclass[varwidth=true, border=5pt]{article}
\usepackage[active,tightpage]{preview}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usepackage{tikz}
\usetikzlibrary{arrows, positioning} 
\usepackage{helvet}
\usepackage[eulergreek]{sansmath}

\begin{document}
\begin{preview}
\begin{tikzpicture}
    \begin{axis}[
        width=13.4cm,
        height=10.0cm,
        % Grid
        grid = major,
        % size
        xmin= 40,     % start the diagram at this x-coordinate
        xmax= 90,   % end   the diagram at this x-coordinate
        ymin= 0,     % start the diagram at this y-coordinate
        ymax= 60, % end   the diagram at this y-coordinate
        % Legende
        legend style={
            font=\large\sansmath\sffamily,
            at={(0.5,-0.18)},
            anchor=north,
            legend cell align=left,
            legend columns=-1,
            column sep=0.5cm
        },
        % Ticks
        tick align=inside,
        every axis/.append style={font=\large\sansmath\sffamily},
        minor tick style={thick},
        scaled y ticks = false,
        % Axis
        axis line style = {very thick,shorten <=-0.5\pgflinewidth},
        axis lines = middle,
        axis line style = very thick,
        xlabel=Gesamtausgaben,
        x label style={at={(axis description cs:0.5,-0.05)},
                       anchor=north,
                       font=\boldmath\sansmath\sffamily\Large},
        ylabel=Luxusausgaben,
        y label style={at={(axis description cs:-0.05,0.5)},
                       anchor=south,
                       rotate=90,
                       font=\boldmath\sansmath\sffamily\Large}
        ]
\addplot[
scatter,
only marks,
point meta=explicit symbolic,
scatter/classes={
a={mark=x,red!90!black},%
b={mark=x,cyan!50!black}},
]
table[col sep=comma, meta=label] {data.csv};

\addplot[
scatter,
only marks,
point meta=explicit symbolic,
scatter/classes={
b={mark=*,mark size=4pt,red!30!white,draw=black},%
c={mark=*,mark size=4pt,cyan!30!white,draw=black},%
a={mark=*,mark size=4pt,green!70!black,draw=black,pin=135:{\color{black}$(65, 35)$},label={(65, 35)}] {}}},
]
table[meta=label] {
    x   y   label
    65  35  a
    70  40  b
    60  20  c
};
% \addlegendentry{Gruppe 1}
% \addlegendentry{Gruppe 2}
\end{axis}
\end{tikzpicture}
\end{preview}
\end{document}

数据

数据由以下 Python 脚本生成

#!/usr/bin/env python

import matplotlib.pyplot as plt
import numpy
import csv


def main(n):
    cov = [[25, 20], [20, 25]]

    meanI = [70, 40]
    datapointsI = n

    meanII = [60, 20]
    datapointsII = n

    dataI = numpy.random.multivariate_normal(meanI, cov, datapointsI).T
    x, y = dataI
    plt.plot(x, y, 'x')

    dataII = numpy.random.multivariate_normal(meanII, cov, datapointsII).T
    x, y = dataII
    plt.plot(x, y, 'x')

    plt.axis('equal')
    plt.show()

    data = []
    xs, ys = dataI
    for x, y in zip(xs, ys):
        data.append([x, y, 'a'])
    xs, ys = dataII
    for x, y in zip(xs, ys):
        data.append([x, y, 'b'])

    # Write data to csv files
    with open("data.csv", 'wb') as csvfile:
        csvfile.write("x,y,label\n")
        spamwriter = csv.writer(csvfile, delimiter=',',
                                quotechar='"', quoting=csv.QUOTE_MINIMAL)
        for datapoint in data:
            spamwriter.writerow(datapoint)

if __name__ == "__main__":
    from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
    parser = ArgumentParser(description=__doc__,
                            formatter_class=ArgumentDefaultsHelpFormatter)
    parser.add_argument("-n",
                        dest="n", default=2000, type=int,
                        help="how many points should get generated")
    args = parser.parse_args()
    main(args.n)

如果您不想执行该脚本,您也可以从存储库下载数据:https://github.com/MartinThoma/LaTeX-examples/tree/master/tikz/csv-2d-gaussian-multivarate-distributions

答案1

labelpinnode选项,但情节标记不是nodes,这就是为什么这些选项不会产生任何输出。

在这种情况下,我不建议使用\addplot命令,因为每个点都需要完全不同的样式。我只会使用普通的 TikZ 命令:

\documentclass[varwidth=true, border=5pt]{article}
\usepackage[active,tightpage]{preview}
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usepackage{tikz}
\usetikzlibrary{arrows, positioning} 
\usepackage{helvet}
\usepackage[eulergreek]{sansmath}

\begin{document}
\begin{preview}
\begin{tikzpicture}
    \begin{axis}[
            clip mode=individual,
        width=13.4cm,
        height=10.0cm,
        % Grid
        grid = major,
        % size
        xmin= 40,     % start the diagram at this x-coordinate
        xmax= 90,   % end   the diagram at this x-coordinate
        ymin= 0,     % start the diagram at this y-coordinate
        ymax= 60, % end   the diagram at this y-coordinate
        % Legende
        legend style={
            font=\large\sansmath\sffamily,
            at={(0.5,-0.18)},
            anchor=north,
            legend cell align=left,
            legend columns=-1,
            column sep=0.5cm
        },
        % Ticks
        tick align=inside,
        every axis/.append style={font=\large\sansmath\sffamily},
        minor tick style={thick},
        scaled y ticks = false,
        % Axis
        axis line style = {very thick,shorten <=-0.5\pgflinewidth},
        axis lines = middle,
        axis line style = very thick,
        xlabel=Gesamtausgaben,
        x label style={at={(axis description cs:0.5,-0.05)},
                       anchor=north,
                       font=\boldmath\sansmath\sffamily\Large},
        ylabel=Luxusausgaben,
        y label style={at={(axis description cs:-0.05,0.5)},
                       anchor=south,
                       rotate=90,
                       font=\boldmath\sansmath\sffamily\Large}
        ]
\addplot[
scatter,
only marks,
point meta=explicit symbolic,
scatter/classes={
a={mark=*,red!90!black, mark size=1, opacity=0.3, on layer=axis background},%
b={mark=*,cyan!50!black, mark size=1, opacity=0.3}},
]
table[col sep=comma, meta=label] {data.csv};

\filldraw [fill=red!50, draw=white, thick] (axis cs:70,40) circle [radius=4pt];
\filldraw [fill=cyan!50, draw=white, thick] (axis cs:60,20) circle [radius=4pt];
\filldraw [fill=yellow, draw=black, thick] (axis cs:65,35) circle [radius=4pt] node [label={[inner sep=1pt, fill=white,text=black, fill opacity=0.75, text opacity=1]above left:$(65, 35)$}] {};

% \addlegendentry{Gruppe 1}
% \addlegendentry{Gruppe 2}
\end{axis}
\end{tikzpicture}
\end{preview}
\end{document}

相关内容