我有一个两列未分类的数据集,其中大多数点沿y = x对角线对齐,但有些点不对齐。
我想表明大多数点实际上沿着函数对齐,但只是点绘图只会将过度表示的点重叠为一。然后观察者会得到数据点实际上随机散布的印象,因为对于出现次数没有权重。
有没有办法对不止一次出现的点实施权重 - 可能是通过磅值?无法找到关于这个主题的任何内容。
非常感谢!
答案 0 :(得分:0)
你没有显示数据,所以我从你的描述中推测了一些东西。正如@Christoph 已经提到的,您可以使用抖动或透明度来表明同一位置或多或少有更多的数据点。但是,透明度限制为 256 个值(实际上是 255,因为您看不到完全透明)。因此,在极端情况下,如果您彼此叠加超过 255 分,您将看不到彼此叠加 255 分的差异。
基本上,您要求显示点的密度。这让我想起了这个问题:How to plot (x,y,z) points showing their density
在下面的示例中,创建了一个“伪”二维直方图。我不知道 gnuplot 中的 2D 直方图,因此您必须将其作为 1D 直方图映射到 2D 上。您将图划分为字段并计算每个字段中点的出现次数。此数字用于通过调色板设置点变量颜色或用于变量点大小。
代码示例将生成 5 种绘制数据的方法:
我让你来判断哪种方式合适。当然,这在很大程度上取决于数据和您的特殊情况。
代码:
### different ways to show density of datapoints
reset session
# create some random test data
set print $Data
do for [i=1:1000] {
x=invnorm(rand(0))
y=x+invnorm(rand(0))*0.05
print sprintf("%g %g",x,y)
}
do for [i=1:1000] {
x=rand(0)*8-4
y=rand(0)*8-4
print sprintf("%g %g",x,y)
}
set print
Xmin=-4.0; Xmax=4.0
Ymin=-4.0; Ymax=4.0
BinXSize = 0.1
BinYSize = 0.1
BinXCount = int((Xmax-Xmin)/BinXSize)+1
BinYCount = int((Ymax-Ymin)/BinYSize)+1
BinXNo(x) = floor((x-Xmin)/BinXSize)
BinYNo(y) = floor((y-Ymin)/BinYSize)
myBinNo(x,y) = (_tmp =BinYNo(y)*BinXCount + BinXNo(x), \
_tmp < 0 || _tmp > BinXCount*BinYCount-1 ? NaN : int(_tmp+1))
# get data into 1D histogram
set table $Bins
plot [*:*][*:*] $Data u (myBinNo($1,$2)):(1) smooth freq
unset table
# initialize array all values to 0
array BinArr[BinXCount*BinYCount]
do for [i=1:BinXCount*BinYCount] { BinArr[i] = 0 }
# get histogram values into array
set table $Dummy
plot myMax=NaN $Bins u ($2<myMax?0:myMax=$2, BinArr[int($1)] = int($2)) w table
unset table
myBinValue(x,y) = (_tmp2 = myBinNo(x,y), _tmp2>0 && _tmp2<=BinXCount*BinYCount ? BinArr[_tmp2] : NaN)
# point size settings
myPtSizeMin = 0.0
myPtSizeMax = 2.0
myPtSize(x,y) = myBinValue(x,y)*(myPtSizeMax-myPtSizeMin)/myMax*myPtSizeMax + myPtSizeMin
set size ratio -1
set xrange [Xmin:Xmax]
set yrange [Ymin:Ymax]
set key top center out opaque box
set multiplot layout 2,3
plot $Data u 1:2 w p pt 7 lc "red" ti "solid points"
plot $Data u 1:2 w p pt 6 lc "red" ti "empty points"
plot $Data u 1:2 w p pt 7 lc "0xeeff0000" ti "transparent points"
set multiplot next
plot $Data u 1:2:(myBinValue($1,$2)) w p pt 7 ps 0.5 palette z ti "colored points"
plot $Data u 1:2:(myPtSize($1,$2)) w p pt 7 ps var lc "web-blue" ti "sized points"
unset multiplot
### end of code
结果: