gnuplot 中的发光(霓虹灯)效果
Glowing (neon) effect in gnuplot
我想在 gnuplot 中重现这个效果:
我怎样才能实现它?如果做不出来,用什么软件可以重现?
设置黑色背景,然后用不同的颜色多次绘制数据集并减小点大小。
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 pm3d
、set dgrid3d gauss kdensity2d
和 set view map
的一些组合,结合合适的调色板,请参阅我的其他答案。
免责声明:可以按照此答案中的说明使用 gnuplot 完成,但您可能应该考虑使用不同的工具来绘制这种特定类型的图。
至少有一种方法可以做到这一点,即对数据进行预处理。这个想法是通过使用高斯核来涂抹数据点来模拟发光效果。考虑以下数据,包含在名为 data
的文件中:
1 2
1 2.1
1.1 2.2
2 3
3 4
我特意将前 3 个点彼此靠近放置,以便能够观察相邻点的增强辉光。这些数据如下所示:
现在我们使用二维高斯核对数据点进行涂抹。我编写了以下 python 代码来帮助解决这个问题。该代码在每个点周围有 4 个标准偏差(sx
和 sy
)的截止值。如果您希望发光是一个圆形,您应该选择标准偏差,以便 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
为数据文件名,sx
和sy
为标准偏差。
现在,回到 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
你可以看到这些点实际上是椭圆,因为轴长度的比例与不同方向的标准差的比例不一样。这可以很容易地解决:
plot "< python script.py data 0.05 0.06" w image
可以在 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(/3)**2*20):(1) with pm3d notitle
我想在 gnuplot 中重现这个效果:
我怎样才能实现它?如果做不出来,用什么软件可以重现?
设置黑色背景,然后用不同的颜色多次绘制数据集并减小点大小。
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 pm3d
、set dgrid3d gauss kdensity2d
和 set view map
的一些组合,结合合适的调色板,请参阅我的其他答案。
免责声明:可以按照此答案中的说明使用 gnuplot 完成,但您可能应该考虑使用不同的工具来绘制这种特定类型的图。
至少有一种方法可以做到这一点,即对数据进行预处理。这个想法是通过使用高斯核来涂抹数据点来模拟发光效果。考虑以下数据,包含在名为 data
的文件中:
1 2
1 2.1
1.1 2.2
2 3
3 4
我特意将前 3 个点彼此靠近放置,以便能够观察相邻点的增强辉光。这些数据如下所示:
现在我们使用二维高斯核对数据点进行涂抹。我编写了以下 python 代码来帮助解决这个问题。该代码在每个点周围有 4 个标准偏差(sx
和 sy
)的截止值。如果您希望发光是一个圆形,您应该选择标准偏差,以便 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
为数据文件名,sx
和sy
为标准偏差。
现在,回到 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
你可以看到这些点实际上是椭圆,因为轴长度的比例与不同方向的标准差的比例不一样。这可以很容易地解决:
plot "< python script.py data 0.05 0.06" w image
可以在 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(/3)**2*20):(1) with pm3d notitle