2017-03-28 7 views
-1

Ich möchte RGB- oder HSV-Farben von Grün nach Blau interpolieren. Ich möchte jedoch, dass der Mittelwert des Gaußschen Grüns grün ist, so dass der Großteil des Satzes von grünlichen Farben dominiert wird. Am Ende möchte ich erreichen, dass wenn Sie von grün nach blau oder rot interpolieren, Sie von der Menge abweichen. So etwas wie dies, aber die Mehrheit sollte grün sein ..Python, wie man einen normalverteilten Satz von RGB-Farben erzeugt

enter image description here

+0

Ich bin mir nicht sicher, was Sie fragen, aber wenn Sie Daten plotten sind, lesen Sie die Gründe hinter den neuen Standard-Colormaps in Matplotlib http://matplotlib.org/users/dflt_style_changes.html –

+0

Ich brauche Datenabtastwerte in RGB oder einem anderen Farbformat, die zu der oben beschriebenen Verteilung passen. –

+0

Hat die 'cmap = cm.jet'' Farbleiste nicht ihren grünen Mittelwert?Also '' cmap (val) '' wo val ist Ihre Stichprobe von Gauss-Verteilung gezeichnet sollte zurückgeben, was Sie wollen. – alexblae

Antwort

0

Dies kann mit dem HS erreicht werden V Farbraum, für den reines Grün bei H = 120 Grad ist. Sie können eine bivariate Normalverteilung in HV Raum von num Punkte schaffen eine mean und verteilt entsprechend der Kovarianzmatrix cov zentriert:

import numpy as np 

num = 1000 
mean = [120,0.5] # [hue,value] 
cov = [[20,0],[0,0.01]] 
hv = np.random.multivariate_normal(mean,cov,num) 

Als nächstes Modulo wir die Matrix, so dass Punkte über die Grenzen geschleift werden zurück in:

hv[:,0] %= 360 
hv[:,1] %= 1 

Als nächstes leihen wir von here eine RGB-Karte in HS Raum zu schaffen (V = 1):

from matplotlib.colors import hsv_to_rgb 
import matplotlib.pyplot as plt 

V, H = np.mgrid[0:1:100j, 0:1:300j] 

S = np.ones_like(V) 
HSV = np.dstack((H,S,V)) 
RGB = hsv_to_rgb(HSV) 

plt.imshow(RGB, origin="lower", extent=[0, 360, 0, 1], aspect=150) 

Schließlich überlagert unsere Verteilung auf H-S Raum:

plt.scatter(hv[:,0],hv[:,1]) 
plt.show() 

enter image description here Sie können mit cov rumspielen, um die gewünschten Verteilung zu erreichen. Zum Beispiel gibt cov = [[80,0.7],[0.1,0.006]] uns

enter image description here

Auch können Sie leicht dieses Beispiel auf drei Dimensionen erweitern, um Änderungen in der Sättigung zu berücksichtigen.

0

Eine Option ist die folgende.
Sie würden zuerst eine Colormap benötigen, die in ihrer Mitte grün hat. Wenn keiner der verfügbaren standard colormaps für Sie arbeitet, können Sie Ihre eigene Colormap erstellen. Im einfachsten Fall wäre es besteht aus drei Farben (blau, grün, rot)

colors = ["blue", "green", "red"] 
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("name", colors) 

Sie dann eine Normalisierung Instanz mit seinem Zentrum in der Mitte der Normalverteilung verwendet werden können. Hier wählen wir, dass es bei 0 ist; daher müssen die Normierungsgrenzen symmetrisch um Null sein.

norm = matplotlib.colors.Normalize(vmin=-3, vmax=3) 

nun eine normalverteilte Variable mit x Sie vom colormap als

sample = cmap(norm(x)) 

Um dies zu plotten abtasten kann, ein komplettes Beispiel unten finden:

import matplotlib 
import matplotlib.pyplot as plt 
import numpy as np 


n = 600 
x = np.random.normal(size=n) 
y = np.random.rand(n) 

colors = ["blue", "green", "red"] 
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("name", colors) 
norm = matplotlib.colors.Normalize(vmin=-3, vmax=3) 
fig, (ax, ax2) = plt.subplots(nrows=2, figsize=(6,3), 
     gridspec_kw={"height_ratios":[1,3]}, sharex=True) 
ax.axis("off") 
ax.hist(x, bins=21, edgecolor="k") 
sc = ax2.scatter(x,y,s=15, c=x, cmap=cmap, norm=norm) 
fig.colorbar(sc, ax=ax2) 
cax = fig.colorbar(sc, ax=ax) 
cax.ax.set_visible(False) 
plt.show() 

enter image description here

+0

Was bedeutet die y-Achse? – Crispin

+0

Die y-Achse wird nur verwendet, um die Punkte im Raum zu strecken. Wenn sie alle auf einer Linie wären, könnten Sie sie nicht mehr unterscheiden. Die relevante Dimension ist die x-Dimension, die entsprechend der Farbkarte in Raum und Farbe codiert ist. – ImportanceOfBeingErnest

Verwandte Themen