2017-01-14 5 views
2

Ich muss eine Sammlung von Patches mit einer benutzerdefinierten Colormap plotten. Ich habe das funktioniert gut, aber ich kann alpha nicht richtig mit meiner benutzerdefinierten Colormap verwenden. Wie Sie in den Bildern und dem angehängten Code sehen können, wird das Alpha auf die Patches angewendet, aber die Farbleiste wird immer noch mit Alpha = 1 angezeigt, was die Karte "falsch" macht. Um das zu überprüfen, habe ich das mit Jet getestet, und die Farbleiste spiegelt das richtige Alpha wieder. Ich gehe davon aus, etwas in der Art und Weise fehlt ich meine colorbar definiert, aber die Dokumentation wird in herauszufinden, was ...implementieren Sie Alpha für benutzerdefinierte Colormap

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

x = np.random.rand(50,1)*500; y = np.random.rand(50,1)*500; 
radius = np.random.rand(50,1)*50 
patches = [] 
for i in range(len(radius)): 
    circle = matplotlib.patches.Circle((x[i], y[i]), radius[i]) 
    patches.append(circle) 
fig, ax = plt.subplots() 
colors = 100*np.random.rand(len(patches)) 
p = matplotlib.collections.PatchCollection(patches) 
p.set(array = colors, cmap = 'Spectral', alpha=0.5) 
ax.add_collection(p) 
plt.colorbar(p, alpha=0.5) 
plt.xlim(0,500);plt.ylim(0,500); 
plt.gca().set_aspect(1) 
plt.show() 

############ 
r = np.hstack((np.zeros(425),np.linspace(0,255,430), np.linspace(254,0,425))) 
g = np.hstack((np.linspace(0,255,430), np.linspace(254,0,425), np.zeros(425))) 
b = np.hstack((np.linspace(255,0,430), np.zeros(425),np.linspace(0,254,425))) 
c = np.array([r,g,b]).T 
mycm = matplotlib.colors.ListedColormap(c/255.0) 
########### 
x = np.random.rand(50,1)*500; y = np.random.rand(50,1)*500; 
radius = np.random.rand(50,1)*50 
patches = [] 
for i in range(len(radius)): 
    circle = matplotlib.patches.Circle((x[i], y[i]), radius[i]) 
    patches.append(circle) 
fig, ax = plt.subplots() 
colors = 100*np.random.rand(len(patches)) 
p = matplotlib.collections.PatchCollection(patches) 
p.set(array = colors, cmap = mycm, alpha=0.5) 
ax.add_collection(p) 
plt.colorbar(p, alpha=0.5) 
plt.xlim(0,500);plt.ylim(0,500); 
plt.gca().set_aspect(1) 
plt.show() 

plot made using jet plot made using my colormap

Antwort

0

Wie im ersten Fall nicht hilfreich gewesen zu sehen Bild, Matplotlib fügt kleine Linien zwischen den Farben in der Farbleiste hinzu. Diese Zeilen stammen aus der pcolormesh, die verwendet wird, um die Farbleiste zu erstellen. Ich habe keine Ahnung, warum sie dort sind, und ich weiß auch nicht, wie ich sie loswerden soll, aber diese Zeilen sind der Grund für das Problem, dass der Alpha-Wert nicht richtig angezeigt wird. Da sie etwas dunkler erscheinen als die echte Farbe, ist es klar, dass, wenn man mehr und mehr Linien zur Farbleiste hinzufügt, die komplette Farbleiste aus diesen Linien besteht und somit dunkler oder weniger transparent erscheint. Dies ist genau das, was im zweiten Fall gemacht wird, wo ein ListedColormap mit 430 + 425 + 425 = 1280 Werten verwendet wird.

Die Lösung ist daher reduziert die Anzahl der Farben in den ListedColormap auf einen Wert unter 255 Im Beispielcode wäre unter I 90.

import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 
############ 
n= 30 
r = np.hstack((np.zeros(n),np.linspace(0,255,n), np.linspace(254,0,n))) 
g = np.hstack((np.linspace(0,255,n), np.linspace(254,0,n), np.zeros(n))) 
b = np.hstack((np.linspace(255,0,n), np.zeros(n),np.linspace(0,254,n))) 
c = np.array([r,g,b]).T 
mycm = matplotlib.colors.ListedColormap(c/255.0) 
########### 
x = np.random.rand(50,1)*500; y = np.random.rand(50,1)*500; 
radius = np.random.rand(50,1)*50 
patches = [] 
for i in range(len(radius)): 
    circle = matplotlib.patches.Circle((x[i], y[i]), radius[i]) 
    patches.append(circle) 
fig, ax = plt.subplots() 
colors = 100*np.random.rand(len(patches)) 
p = matplotlib.collections.PatchCollection(patches) 
p.set(array = colors, cmap = mycm, alpha=0.5) 
ax.add_collection(p) 
plt.colorbar(p, alpha=0.5) 
plt.xlim(0,500);plt.ylim(0,500); 
plt.gca().set_aspect(1) 
plt.savefig(__file__+".png") 
plt.show() 
verwendet

enter image description here

+0

Relevant: https: //github.com/matplotlib/matplotlib/issues/5151 – tom

Verwandte Themen