2016-08-01 24 views
1

Ich möchte eine 2D-Hanning-Fensterfunktion für ein Bild mit N=512 Pixel mit einem Farbbalken als Vektorgrafik (*.svg, *.eps, (vektorisiert) !) *.pdf oder so) ... also muss ichErstellen Sie eine Vektorgrafik (Svg, Eps, PDF) "Heatmap" von 2D-Funktion mit Colorbar

w(x,y) = sin(x*pi/N)^2 * sin(y*pi/N)^2 

Meine Lösung für dieses python war eine 2D-Funktion zeichnen zuerst: Das Ergebnis dieses Bild ist

import numpy as np 
from PIL import Image 

im_hanning = Image.new("F", (N, N)) 
pix_hanning = im_hanning.load() 

for x in range(0, N): 
    for y in range(0, N): 
     pix_hanning[x,y] = np.sin(x*np.pi/N)**2 * np.sin(y*np.pi/N)**2 * 255 

im_hanning = Image.fromarray(array) 

:

Aber das ist natürlich eine Rastergrafik.

Also habe ich es mit gnuplot versucht. Dies schien besser, bis ich das Ergebnis sah:

set xrange [0:1] 
set yrange [0:1] 
unset xtics 
unset ytics 

set pm3d map 
set size square 

set samples 512 
set isosamples 512 
set palette gray 

splot sin(x*pi)**2 * sin(y*pi)**2 

ich die Proben erhöhen musste, sonst sah es schrecklich ... Das Ergebnis sieht gut aus: hanning window function with gnuplot

Besonders gut gefällt mir die colorbar auf der rechten Seite. Aber das erzeugt (egal welches Terminal ich eingestellt habe) Rastergrafiken wieder.

Gibt es eine Möglichkeit, eine 2D-Funktion als Vektorgrafiken zu plotten?

+0

Oh, und was ich gerade sehe: Der Farbverlauf der Bilder ist nicht identisch, oder? Was ist der "richtige" Farbverlauf, was ist los? Vermisse ich etwas? – nox

Antwort

1

Mit einem PDF-, SVG- oder EPS-Terminal gibt Ihnen gnuplot Vektorgrafiken. Aber die Funktion muss in irgendeiner Weise dargestellt werden, und was Gnuplot tut ist eine stückweise lineare Interpolation, das heißt, die Oberfläche wird durch kleine Teile der Ebene (Dreiecke oder Vierecke) dargestellt, deren Anzahl durch die Stichprobe festgelegt wird Bewertung.

Wenn Sie eine unendlich skalierbare Farbkarte wünschen, muss die Art und Weise, wie Sie diese erzeugen, eine Primitive der skalierbaren Vektorsprache sein, die Sie verwenden, z. SVG. Das ist also Ihre eigentliche Frage: Gibt es ein SVG/PDF/EPS-Primitiv, um den Gradienten sin(x*pi)**2 * sin(y*pi)**2 darzustellen? Ich glaube, das ist nicht der Fall, Farbverläufe sind auch stückweise lineare AFAIK, aber auf diese Weise können Sie Antworten von Spezialisten anziehen.

+0

Danke, dass Sie in die richtige Richtung zeigen. Und natürlich bekomme ich Vektorgrafik - aber nicht die, die ich bekommen wollte. – nox