是否可以设置 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 结合使用不透明度、标记大小和标签来识别每个坐标处的点数。使用 和 来添加每个坐标处的值的数量node
。pin
这提供了明确指示每个点处的值数量的功能。
请注意 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}