gnuplot中的发光(霓虹灯)效果

时间:2016-04-06 18:15:26

标签: gnuplot glow

我想在gnuplot中重现这种效果:

neon effect

我怎样才能实现它?如果无法完成,我可以用什么软件来重现它?

3 个答案:

答案 0 :(得分:5)

可以在gnuplot内部为每个像素使用2d内核。这样,更密集的累积比单个像素更亮。检查show palette rgbformulae以及帮助中相应的章节以更改颜色。

  set term wxt size 300,300 background rgb 0
  set view map
  set samp 140                                       
  set dgrid3d 180,180, gauss kdensity2d 0.2,0.2   
  set palette rgbform 4,4,3   
  splot "+" us 1:(sin($1/3)**2*20):(1)  with pm3d notitle

答案 1 :(得分:4)

免责声明:可以按照此答案中的说明使用gnuplot完成,但您可能应该考虑使用其他工具来绘制此特定类型的绘图。

通过预处理数据,至少有一种方法可以做到这一点。我们的想法是通过使用高斯内核来模拟数据点来模拟发光效果。请考虑以下数据,包含在名为data的文件中:

1   2
1   2.1
1.1 2.2
2   3
3   4

我故意将前3个点彼此靠近放置,以便能够观察到相邻点的强烈发光。这些数据如下所示:

enter image description here

现在我们使用2D高斯内核涂抹数据点。我编写了以下python代码来帮助解决这个问题。代码在每个点周围有4个标准差(sxsy)的截止值。如果希望发光为圆形,则应选择标准偏差,以使sx / sy比率与gnuplot中x / y轴长度的比率相同。否则点将看起来像椭圆。这是代码:

import numpy as np
import sys

filename = str(sys.argv[1])
sx = float(sys.argv[2])
sy = float(sys.argv[3])

def f(x,y,x0,y0,sx,sy):
    return np.exp(-(x-x0)**2/2./sx**2 -(y-y0)**2/2./sy**2)

datafile = open(filename, 'r')

data = []
for datapoint in datafile:
    a, b = datapoint.split()
    data.append([float(a),float(b)])

xmin = data[0][0]
xmax = data[0][0]
ymin = data[0][1]
ymax = data[0][1]
for i in range(1, len(data)):
    if(data[i][0] < xmin):
        xmin = data[i][0]
    if(data[i][0] > xmax):
        xmax = data[i][0]
    if(data[i][1] < ymin):
        ymin = data[i][1]
    if(data[i][1] > ymax):
        ymax = data[i][1]

xmin -= 4.*sx
xmax += 4.*sx
ymin -= 4.*sy
ymax += 4.*sy

dx = (xmax - xmin) / 250.
dy = (ymax - ymin) / 250.

for i in np.arange(xmin,xmax+dx, dx):
    for j in np.arange(ymin,ymax+dy, dy):
        s = 0.
        for k in range(0, len(data)):
            d2 = (i - data[k][0])**2 + (j - data[k][1])**2
            if( d2 < (4.*sx)**2 + (4.*sy)**2):
                s += f(i,j,data[k][0],data[k][1],sx,sy)
        print i, j, s

使用如下:

python script.py data sx sy

其中script.py是代码所在文件的名称,data是数据文件的名称,sxsy是标准偏差

现在,回到gnuplot,我们定义了一个模仿发光模式的调色板。对于孤立点,求和高斯在该点的位置处产生1;对于重叠点,它会产生大于1的值。在定义调色板时必须考虑这一点。以下只是一个例子:

set cbrange [0:3]
unset colorbox
set palette defined (0 "black", 0.5 "blue", 0.75 "cyan", 1 "white", 3 "white")
plot "< python script.py data 0.05 0.05" w image

enter image description here

您可以看到这些点实际上是椭圆,因为轴长度的比率与沿不同方向的标准偏差的比率不同。这很容易解决:

plot "< python script.py data 0.05 0.06" w image

enter image description here

答案 2 :(得分:1)

设置黑色背景,然后使用不同的颜色多次绘制数据集,并减少分数。

  set term wxt backgr rgb "black"
  plot sin(x) w p pt 7 ps 2 lc rgb 0x00003f not, \
       sin(x) w p pt 7 ps 1.5 lc rgb 0x00007f not, \
       sin(x) w p pt 7 ps 1 lc rgb 0x0000af not,  \
       sin(x) w p pt 7 ps .5 lc rgb 0x0000ff

或者,可以使用splot with pm3dset dgrid3d gauss kdensity2dset view map的某些组合以及合适的调色板,请参阅我的其他答案。