Gnuplot - 加权点大小

时间:2018-01-25 15:30:21

标签: plot gnuplot visualization

我有一个两列未分类的数据集,其中大多数点沿y = x对角线对齐,但有些点不对齐。

我想表明大多数点实际上沿着函数对齐,但只是点绘图只会将过度表示的点重叠为一。然后观察者会得到数据点实际上随机散布的印象,因为对于出现次数没有权重。

有没有办法对不止一次出现的点实施权重 - 可能是通过磅值?无法找到关于这个主题的任何内容。

非常感谢!

1 个答案:

答案 0 :(得分:0)

你没有显示数据,所以我从你的描述中推测了一些东西。正如@Christoph 已经提到的,您可以使用抖动或透明度来表明同一位置或多或少有更多的数据点。但是,透明度限制为 256 个值(实际上是 255,因为您看不到完全透明)。因此,在极端情况下,如果您彼此叠加超过 255 分,您将看不到彼此叠加 255 分的差异。

基本上,您要求显示点的密度。这让我想起了这个问题:How to plot (x,y,z) points showing their density

在下面的示例中,创建了一个“伪”二维直方图。我不知道 gnuplot 中的 2D 直方图,因此您必须将其作为 1D 直方图映射到 2D 上。您将图划分为字段并计算每个字段中点的出现次数。此数字用于通过调色板设置点变量颜色或用于变量点大小。

代码示例将生成 5 种绘制数据的方法:

  1. 实点
  2. 空分
  3. 透明点
  4. 彩色点
  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

结果:

enter image description here