2016-04-06 44 views
6

Chcę odtworzyć ten efekt w gnuplot:Glowing (neon) efekt w gnuplot

neon effect

Jak mogę achive go? Jeśli nie można tego zrobić, jakie oprogramowanie mogę użyć do jego odtworzenia?

+1

Jakie oprogramowanie zostało użyte do stworzenia tego obrazu? – Matthew

+0

@Matthew Nie jestem pewien, fabuła nie jest moja, ale widziałem podobne wątki w najnowszym Excelu: [Excel glow] (http://excel.demist-it.com/wp-content/uploads/2015/02/final-graph-hidden-rows.png) – RedPointyJackson

Odpowiedz

5

Korzystanie 2d jądro dla każdego piksela może być wykonana wewnątrz gnuplot. W ten sposób bardziej gęste akumulacje stają się jaśniejsze niż pojedyncze piksele. Sprawdź show palette rgbformulae i odpowiedni rozdział w pomocy, aby zmienić kolory.

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 
+0

Jestem zdumiony, że zrobiłeś to w czystym gnuplot. Rządzisz. – RedPointyJackson

+0

Przypuszczam, że to zasługa dawnych i obecnych programistów. – Karl

1

Ustaw czarne tło, a następnie narysuj swój zbiór danych kilka razy w różnych kolorach z malejącą wartością punktów.

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 

Alternatywnie, pewne kombinacje splot with pm3d, set dgrid3d gauss kdensity2d i set view map, w połączeniu z odpowiednim palecie można zastosować poniższe odpowiedź.

+0

Problem z tym podejściem polega na tym, że blask z sąsiednich kropek nie "zlewa się". Zastanawiałem się nad umieszczeniem podejścia, które działa, ale jest bardzo niezdarne do wdrożenia: wykonaj splot z funkcją 2D Gaussa wszystkich punktów na płaszczyźnie XY (każdy Gaussian jest wycentrowany w odpowiadającym mu punkcie), a następnie zsumuj wszystkich Gaussian. Teraz narysuj trójwymiarową mapę kolorów z paletą kolorów naśladującą efekt świecący. Przetestowałem to z kilkoma punktami i to działa: w przypadku dowolnej liczby punktów trzeba polegać na zewnętrznym programie (np. Python), więc nie opublikowałem go. – Miguel

+0

@Miguel Jeśli to działa, powinieneś go opublikować. Możliwe, że jedynym sposobem na to jest za pomocą zewnętrznego programu. Próbowałem użyć tego samego podejścia co ta odpowiedź, ale ustawiłem alfa niższą niż nieprzezroczystą, aby moje punkty się połączyły. Nie byłam jednak z tego całkowicie zadowolona. Nie wyglądało to tak gładko, jak przedstawiony obraz. Mam nadzieję, że OP odpowie na moje pytanie o to, co zostało użyte, ponieważ przyglądanie się, jak to się robi, może zapewnić wgląd w to, jak to zrobić z gnuplotem. – Matthew

+0

@Matthew Przekazałem moje rozwiązanie i skrypt w języku Python do wstępnego przetwarzania, ale nie jestem z niego zadowolony: zbyt skomplikowane jest robienie tego, co powinno być bardzo proste. – Miguel

3

Zrzeczenie się odpowiedzialności: Można to zrobić za pomocą gnuplot zgodnie z instrukcją w tej odpowiedzi, ale prawdopodobnie powinieneś rozważyć inne narzędzie do narysowania tego konkretnego rodzaju wykresu.

Istnieje co najmniej jeden sposób, aby to zrobić, z preprocessing danych. Chodzi o to, aby naśladować efekt blasku za pomocą jądra Gaussa, aby posmarować punkty danych. Rozważmy następujące dane zawarte w pliku o nazwie data:

1 2 
1 2.1 
1.1 2.2 
2 3 
3 4 

mam celowo umieszczony pierwsze 3 punkty blisko siebie, aby móc zaobserwować wzmożony blask sąsiednimi punktami. Dane te wyglądają następująco:

enter image description here

Teraz rozmaz punkty danych przy użyciu 2D jądra Gaussa. Napisałem następujący kod Pythona, aby pomóc w tym. Kod zawiera granicę 4 odchyleń standardowych (sx i sy) wokół każdego punktu. Jeśli chcesz, aby blask był okręgiem, powinieneś wybrać odchylenia standardowe, aby stosunek sx/sy był taki sam jak stosunek długości osi x/y w gnuplot. W przeciwnym razie punkty będą wyglądały jak elipsy. Jest to kod:

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 

Jest on stosowany w następujący sposób:

python script.py data sx sy 

gdzie script.py to nazwa pliku, w którym kod znajduje, data to nazwa pliku danych, a sx i sy są odchylenia standardowe.

Teraz, wracając do gnuplot, definiujemy paletę, która naśladuje świecący wzór. Dla pojedynczych punktów sumowany Gaussians daje 1 w pozycji punktu; dla nakładających się punktów daje wartości wyższe niż 1. Musisz to uwzględnić przy definiowaniu palety. Poniżej tylko przykład:

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

Widać, że punkty są rzeczywiście elipsy, ponieważ stosunek osi o długości nie jest taka sama, jak w przypadku standardowych odchyleń wzdłuż różnych kierunkach .To może być łatwo ustalony:

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

enter image description here