pgfplots 中的叠加标记

pgfplots 中的叠加标记

是否可以设置 pgfplots 中标记的颜色强度,以便您可以看到有多少个标记具有相同的坐标?

例如:如果我得到了点(1, 2), (3, 4), (3, 4),那么 pgfplots 当然只会显示点(1, 2), (3, 4)。是否可以将点(1, 2)显示为(例如)浅蓝色,将点(3, 4)显示为深蓝色?

我想,这可以手动完成,但我想尽可能地实现自动化。

因此 pgfplots 应该查找出现次数最多的点(此处(3, 4)),将其颜色强度设置为 100%,计算单次出现的颜色强度(此处为 50%)。

示例 2:

要点:(1, 1), (2, 2), (2, 2), (-2, -2), (-2, -2), (5, 5), (5, 5), (5, 5), (5, 5), (5, 5)

色彩强度:

(1, 1):20%

(2, 2)(-2, -2):40%

(5, 5):100%

可玩代码:

\documentclass[preview, border={10pt}]{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=1.15}

\begin{filecontents*}{datatable.txt}
one two
 1   1
 2   2
 2   2
-2  -2
-2  -2
 5   5
 5   5
 5   5
 5   5
 5   5
\end{filecontents*}

\begin{document}

\begin{figure}[h!]
\centering
\begin{tikzpicture}
\begin{axis}
\addplot table [x=one, y=two, only marks] {datatable.txt};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}

答案1

这个答案设置了一些用于可视化点的类。该方法在pgfplots手册 v1.15 (2017/06/05) 的第 113 页中有描述。

每个点都附有一个类别标签。类别包括:

  • a 类:(1, 1)——不透明度设置为 20%;
  • b 类:(2, 2)和(-2, -2)- 不透明度设置为 40%;
  • c 类:(5,5)- 设置不透明度为 100%

类标签作为元数据附加到数据值。在这种情况下,如果数据以表格形式提供,则每行变为例如 5 5 1,其中 x 值为 5,y 值为 5,不透明度为 1。请注意,如果数据以坐标形式提供,则语法为:(x 值,y 值) [不透明度值]。

散点图类别被定义为轴选项,使用:

scatter/classes={
    a={mark=*,blue,opacity=0.2},
    b={mark=*,blue,opacity=0.4},
    c={mark=*,blue,opacity=1.0} 
}

这可以定制标记,不仅包括不透明度,还包括颜色、形状、标记大小、旋转等。

其中包括通知情节使用元数据的\addplot选项。scatter src=explicit symbolic

有四个例子。例 1 是 Torbjørn 发布的解答的结果。

例 2 使用类来修改不透明度。

例 3 使用类来修改形状和颜色。

例 4 结合使用不透明度、标记大小和标签来识别每个坐标处的点数。使用 和 来添加每个坐标处的值的数量nodepin这提供了明确指示每个点处的值数量的功能。

请注意 Ex 1 和 Ex 2 之间的颜色差异,但我不知道哪个会被视为“正确”。如果目的是通过修改不透明度来创建视觉差异,则 Ex 1 和 Ex 2 都可以达到此目的。

在此处输入图片描述

这是 MWE:

\documentclass[border={10pt}]{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=1.15}

\begin{filecontents*}{datatable.txt}
one two opacity
 1   1 a
 2   2 b
 2   2 b
-2  -2 b
-2  -2 b
 5   5 c
 5   5 c 
 5   5 c
 5   5 c
 5   5 c
\end{filecontents*}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
title=Ex 1,
height=6cm,
width=6cm,
%legend
]
\addplot [
only marks,
mark size=6pt,
mark options={opacity=0.2,blue},
] table [x=one, y=two] {datatable.txt};
\end{axis}
\end{tikzpicture}%
\begin{tikzpicture}
\begin{axis}[
title=Ex 2,
height=6cm,
width=6cm,
scatter/classes={
    a={mark=*,blue,opacity=0.2},
    b={mark=*,blue,opacity=0.4},
    c={mark=*,blue,opacity=1.0} 
}
]
\addplot[
scatter,
only marks,
mark size=6pt,
scatter src=explicit symbolic
]
 table [x=one,y=two,meta=opacity] {datatable.txt};
\end{axis}
\end{tikzpicture}%
\begin{tikzpicture}
\begin{axis}[
title=Ex 3,
height=6cm,
width=6cm,
scatter/classes={
    a={mark=*,magenta,opacity=1.0},
    b={mark=triangle*,cyan,opacity=1.0},
    c={mark=square*,orange,opacity=1.0} 
}
]
\addplot[
scatter,
only marks,
mark size=6pt,
scatter src=explicit symbolic
]
table [x=one,y=two,meta=opacity] {datatable.txt};
\end{axis}
\end{tikzpicture}%
\begin{tikzpicture}
\begin{axis}[
title=Ex 4,
height=6cm,
width=6cm,
scatter/classes={
    a={mark=*,blue,opacity=0.2,mark size=2},
    b={mark=*,blue,opacity=0.4,mark size=4},
    c={mark=*,blue,opacity=1.0,mark size=6} 
}
]
\addplot[
scatter,
only marks,
mark size=6pt,
scatter src=explicit symbolic,
]
table [x=one,y=two,meta=opacity] {datatable.txt}
node [pin={[pin distance=0.35cm,pin edge={<-,shorten <=3pt,thick}]right:1},pos=0] {}   % pos=0 -> First value in table
node [pin={[pin distance=0.35cm,pin edge={<-,shorten <=3pt,thick}]right:2},pos=0.2] {} % There are 10 data points. There are 2 points at (2,2). The first (2,2) value is in the 2/10 position so pos=0.2
node [pin={[pin distance=0.35cm,pin edge={<-,shorten <=4pt,thick}]right:2},pos=0.4] {} % The 4/10 position
node [pin={[pin distance=0.35cm,pin edge={<-,shorten <=4pt,thick}]left:5},pos=1] {}    % pos=1 -> last value in table
;
\end{axis}
\end{tikzpicture}
\end{document}

答案2

您或许可以降低标记的不透明度。

注意:不要在后面的括号中添加绘图选项table,而是添加\addplot [<plot options>] table[<table options>] {<table>};

代码输出

\documentclass[preview, border={10pt}]{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=1.15}

\begin{filecontents*}{datatable.txt}
one two
 1   1
 2   2
 2   2
-2  -2
-2  -2
 5   5
 5   5
 5   5
 5   5
 5   5
\end{filecontents*}

\begin{document}

\begin{figure}[h!]
\centering
\begin{tikzpicture}
\begin{axis}
\addplot [only marks,mark options={opacity=0.2,blue}] table [x=one, y=two] {datatable.txt};
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}

相关内容