2016-04-06 21 views
6

ich diesen Effekt in gnuplot reproduzieren will:glühende (Neon) Wirkung in gnuplot

neon effect

Wie kann ich es achive? Wenn es nicht möglich ist, welche Software kann ich verwenden, um es zu reproduzieren?

+1

Mit welcher Software wurde das Bild überhaupt erstellt? – Matthew

+0

@Matthew Ich bin mir nicht sicher, die Handlung ist nicht meins, aber ich habe ähnliche Plots in der neuesten Excel gesehen: [Excel glühen] (http://excel.demist-it.com/wp-content/uploads/2015 /02/final-graph-hidden-rows.png) – RedPointyJackson

Antwort

5

ein 2d-Kernel für jedes Pixel verwendet, kann innerhalb gnuplot erfolgen. Auf diese Weise werden dichtere Akkumulationen heller als einzelne Pixel. Überprüfen Sie show palette rgbformulae und das entsprechende Kapitel in der Hilfe, um die Farben zu ändern.

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

Ich bin erstaunt, dass Sie es in reinem gnuplot getan haben. Du schaukelst. – RedPointyJackson

+0

Ich denke, der Kredit geht an die Entwickler der Vergangenheit und Gegenwart. – Karl

1

einen schwarzen Hintergrund, und dann einige Zeit plotten Dataset in verschiedenen Farben mit Punktgröße abnimmt.

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 

Alternativ eine Kombination aus splot with pm3d, set dgrid3d gauss kdensity2d und set view map, mit einer geeigneten Palette kombiniert werden, kann verwendet werden, meine andere Antwort sehen.

+0

Das Problem bei diesem Ansatz ist, dass das Leuchten von benachbarten Punkten nicht "verschmilzt". Ich habe darüber nachgedacht, einen Ansatz zu posten, der funktioniert, aber sehr umständlich zu implementieren ist: führe eine Faltung mit einer 2D-Gauß-Funktion aller Punkte in der XY-Ebene aus (jede Gaußsche zentriert an ihrem entsprechenden Punkt), dann fasse alle Gaussiane zusammen. Zeichnen Sie nun eine 3D-Farbkarte mit der Farbpalette, die den leuchtenden Effekt nachahmt. Ich habe das mit ein paar Punkten getestet und es funktioniert: Für eine beliebige Anzahl von Punkten müsste man sich auf ein externes Programm (z. B. Python) verlassen, also habe ich es nicht gepostet. – Miguel

+0

@Miguel Wenn es funktioniert, sollten Sie es buchen. Es kann sein, dass dies nur mit Hilfe eines externen Programms möglich ist. Ich habe versucht, den gleichen Ansatz wie diese Antwort zu verwenden, aber ich hatte einen Alpha-Wert niedriger als undurchsichtig gesetzt, damit meine Punkte zusammengeführt werden. Ich war jedoch nicht ganz glücklich damit. Es sah nicht so glatt aus wie das bereitgestellte Bild. Ich hoffe, dass das OP meine Frage zu dem beantworten wird, was zuerst verwendet wurde, denn wenn man sich ansieht, wie es gemacht wird, kann es einen Einblick geben, wie man es mit gnuplot macht. – Matthew

+0

@Matthew Ich habe meine Lösung und ein Python-Skript gepostet, um die Vorverarbeitung durchzuführen, aber ich bin nicht damit zufrieden: es ist zu kompliziert, um das zu tun, was sehr einfach sein sollte. – Miguel

3

Haftungsausschluss: Es kann mit Gnuplot wie in dieser Antwort beschrieben durchgeführt werden, aber Sie sollten wahrscheinlich ein anderes Werkzeug betrachten, um diese besondere Art von Handlung zu zeichnen.

Es ist zumindest eine Möglichkeit, es zu tun, mit Vorverarbeitung der Daten. Die Idee besteht darin, den Leuchteffekt nachzuahmen, indem ein Gaußscher Kern verwendet wird, um die Datenpunkte zu verschmieren. Betrachten wir die folgenden Daten in einer Datei enthalten data genannt:

1 2 
1 2.1 
1.1 2.2 
2 3 
3 4 

I absichtlich die ersten 3 Punkte in der Nähe zueinander angeordnet haben, um den verstärkten Glanz der Nachbarpunkte zu beobachten. Diese Daten sehen wie folgt aus:

enter image description here

Jetzt haben wir die Datenpunkte mit Hilfe eines 2D-Gauß-Kern-Abstrich. Ich habe den folgenden Python-Code geschrieben, um dabei zu helfen. Der Code hat einen Grenzwert von 4 Standardabweichungen (sx und sy) um jeden Punkt. Wenn das Glühen ein Kreis sein soll, sollten Sie die Standardabweichungen so wählen, dass das Verhältnis sx/sy dem Verhältnis der x/y-Achsenlängen in gnuplot entspricht. Ansonsten sehen die Punkte wie Ellipsen aus. Dies ist der Code:

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 

Es wird wie folgt verwendet:

python script.py data sx sy 

wo script.py der Name der Datei ist, wo der Code befindet, data der Name der Datendatei ist, und sx und sy sind die Standardabweichungen.

Nun, zurück zu gnuplot, definieren wir eine Palette, die ein leuchtendes Muster nachahmt. Für isolierte Punkte ergeben die summierten Gaussianer 1 an der Position des Punktes; Für überlappende Punkte liefert es Werte größer als 1. Dies muss bei der Definition der Palette berücksichtigt werden. Das folgende ist nur ein Beispiel:

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

Sie können sehen, dass die Punkte sind eigentlich Ellipsen, da das Verhältnis der Achsen Längen ist nicht das gleiche wie die der Standardabweichungen entlang der verschiedenen Richtungen .Dies kann leicht behoben werden:

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

enter image description here