voglio riprodurre questo effetto in gnuplot:Glowing (neon) in vigore nel gnuplot
Come posso achive esso? Se non può essere fatto, quale software posso usare per riprodurlo?
voglio riprodurre questo effetto in gnuplot:Glowing (neon) in vigore nel gnuplot
Come posso achive esso? Se non può essere fatto, quale software posso usare per riprodurlo?
Utilizzando un kernel 2d per ogni pixel può essere fatto all'interno gnuplot. In questo modo, gli accumuli più densi diventano più luminosi dei singoli pixel. Controllare show palette rgbformulae
e il rispettivo capitolo nella guida per cambiare i colori.
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
Sono stupito che tu l'abbia fatto in puro gnuplot. Sei forte. – RedPointyJackson
Immagino che il merito vada agli sviluppatori passati e presenti. – Karl
Impostare uno sfondo nero e quindi tracciare il set di dati più volte in colori diversi con punti decrescenti.
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
In alternativa, una combinazione di splot with pm3d
, set dgrid3d gauss kdensity2d
, e set view map
, in combinazione con una tavolozza adatto, può essere utilizzato, vedere la mia altra risposta.
Il problema con questo approccio è che il bagliore dei punti vicini non "si fonde". Stavo pensando di pubblicare un approccio che funziona, ma è molto maldestro da implementare: eseguire una convoluzione con una funzione gaussiana 2D di tutti i punti nel piano XY (ogni gaussiano centrato nel punto corrispondente), quindi sommare tutti i gaussiani. Ora traccia una mappa dei colori 3D con la tavolozza dei colori che imita l'effetto luminoso. Ho provato questo con un paio di punti e funziona: per numeri arbitrari di punti si dovrebbe fare affidamento su un programma esterno (ad esempio Python), quindi non l'ho postato. – Miguel
@Miguel Se funziona, dovresti postarlo. Potrebbe essere che l'unico modo per farlo è con l'aiuto di un programma esterno. Ho provato ad utilizzare lo stesso approccio di questa risposta, ma avevo impostato un alfa inferiore a quello opaco in modo che i miei punti si fondessero. Non ero completamente soddisfatto, comunque. Non sembrava abbastanza liscio come l'immagine fornita. Spero che l'OP risponda alla mia domanda su ciò che è stato utilizzato in primo luogo, perché guardando come è fatto ci possono fornire informazioni su come farlo con gnuplot. – Matthew
@Matthew Ho postato la mia soluzione e uno script Python per eseguire la pre-elaborazione, ma non ne sono soddisfatto: è troppo complicato fare ciò che dovrebbe essere molto semplice. – Miguel
Declinazione di responsabilità: Può essere eseguito con gnuplot come indicato in questa risposta, ma è consigliabile prendere in considerazione uno strumento diverso per disegnare questo particolare tipo di grafico.
C'è almeno un modo per farlo, con preelaborazione dei dati. L'idea è di imitare l'effetto bagliore usando un kernel gaussiano per imbrattare i punti dati. Prendere in considerazione i seguenti dati, contenuti in un file chiamato data
:
1 2
1 2.1
1.1 2.2
2 3
3 4
ho volutamente messo i primi 3 punti vicini tra loro per essere in grado di osservare il bagliore intensificato di punti vicini. Questi dati appaiono così:
Ora abbiamo striscio i punti dati che utilizzano un kernel gaussiano 2D. Ho scritto il seguente codice Python per aiutare con questo. Il codice ha un taglio di 4 deviazioni standard (sx
e sy
) attorno a ciascun punto. Se si desidera che il bagliore sia un cerchio, è necessario scegliere le deviazioni standard in modo che il rapporto sx/sy
sia uguale al rapporto tra le lunghezze degli assi x/y in gnuplot. Altrimenti i punti sembreranno ellissi. Questo è il codice:
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
È usato come segue:
python script.py data sx sy
dove script.py
è il nome del file in cui si trova il codice, data
è il nome del file di dati, e sx
e sy
sono le deviazioni standard.
Ora, tornando a gnuplot, definiamo una tavolozza che riproduce un motivo luminoso. Per i punti isolati, i gaussiani sommati danno 1 nella posizione del punto; per punti sovrapposti produce valori superiori a 1. È necessario tenerlo presente quando si definisce la tavolozza. Il seguente è solo un esempio:
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
Si può vedere che i punti sono effettivamente ellissi, poiché il rapporto degli assi lunghezze non è la stessa di quella delle deviazioni standard lungo le diverse direzioni .Questo può essere facilmente risolto:
plot "< python script.py data 0.05 0.06" w image
Quale software è stato utilizzato per produrre quell'immagine in primo luogo? – Matthew
@Matthew Non sono sicuro, la trama non è mia, ma ho visto trame simili nel nuovo Excel: [Excel glow] (http://excel.demist-it.com/wp-content/uploads/2015 /02/final-graph-hidden-rows.png) – RedPointyJackson