2015-05-07 11 views
7

Ich mache einige Streudiagramme mit Matplotlib (Python 3.4.0, Matplotlib 1.4.3, läuft auf Linux Mint 17). Es ist einfach genug, Alpha-Transparenz für jeden Punkt einzeln einzustellen; Gibt es eine Möglichkeit, sie als eine Gruppe festzulegen, so dass zwei überlappende Punkte aus derselben Gruppe die Farbe nicht ändern?Wie können Matplotlib-Streudiagramme als Gruppe transparent gemacht werden?

Beispielcode:

import matplotlib.pyplot as plt 
import numpy as np 

def points(n=100): 
    x = np.random.uniform(size=n) 
    y = np.random.uniform(size=n) 
    return x, y 
x1, y1 = points() 
x2, y2 = points() 
fig = plt.figure(figsize=(4,4)) 
ax = fig.add_subplot(111, title="Test scatter") 
ax.scatter(x1, y1, s=100, color="blue", alpha=0.5) 
ax.scatter(x2, y2, s=100, color="red", alpha=0.5) 
fig.savefig("test_scatter.png") 

Ergebnisse in dieser Ausgabe:

enter image description here

aber ich möchte etwas mehr wie dieses:

enter image description here

ich umgehen kann Speichern als SV G und manuell Gruppierung dann in Inkscape, dann Einstellung Transparenz, aber ich würde wirklich etwas bevorzugen, das ich programmieren kann. Irgendwelche Vorschläge?

+0

Wahrscheinlich nicht, denn das tut, ist entgegen, was ein Streudiagramm in der Regel versucht, zu zeigen. – cphlewis

Antwort

5

Ja , interessante Frage. Sie können dieses Streudiagramm mit Shapely erhalten. Hier ist der Code:

import matplotlib.pyplot as plt 
import matplotlib.patches as ptc 
import numpy as np 
from shapely.geometry import Point 
from shapely.ops import cascaded_union 

n = 100 
size = 0.02 
alpha = 0.5 

def points(): 
    x = np.random.uniform(size=n) 
    y = np.random.uniform(size=n) 
    return x, y 

x1, y1 = points() 
x2, y2 = points() 
polygons1 = [Point(x1[i], y1[i]).buffer(size) for i in range(n)] 
polygons2 = [Point(x2[i], y2[i]).buffer(size) for i in range(n)] 
polygons1 = cascaded_union(polygons1) 
polygons2 = cascaded_union(polygons2) 

fig = plt.figure(figsize=(4,4)) 
ax = fig.add_subplot(111, title="Test scatter") 
for polygon1 in polygons1: 
    polygon1 = ptc.Polygon(np.array(polygon1.exterior), facecolor="red", lw=0, alpha=alpha) 
    ax.add_patch(polygon1) 
for polygon2 in polygons2: 
    polygon2 = ptc.Polygon(np.array(polygon2.exterior), facecolor="blue", lw=0, alpha=alpha) 
    ax.add_patch(polygon2) 
ax.axis([-0.2, 1.2, -0.2, 1.2]) 

fig.savefig("test_scatter.png") 

und das Ergebnis ist:

Test scatter

+1

Sehr coole Verwendung von formschön wo ich es nie erwartet hätte! Glauben Sie, dass das "Descartes" -Paket das Plotten vereinfachen würde? –

+0

Danke! Ja, das Paket 'descartes' kann verwendet werden. Nach der 'kaskadierten_Vereinigung': Erstellen Sie Patches mit' descartes.PolygonPatch', verwenden Sie 'matplotlib.collections.PathCollection' und ersetzen Sie' add_patch' durch 'add_collection'. Dies wird die Aufgabe mit weniger Zeilen erledigen. – Flabetvibes

3

Interessante Frage, ich denke, jede Verwendung von Transparenz wird in den Stapeleffekt führen, den Sie vermeiden möchten. Sie könnten manuell eine Transparenztyp Farbe, um näher an den Ergebnissen setzen Sie wollen,

import matplotlib.pyplot as plt 
import numpy as np 

def points(n=100): 
    x = np.random.uniform(size=n) 
    y = np.random.uniform(size=n) 
    return x, y 
x1, y1 = points() 
x2, y2 = points() 
fig = plt.figure(figsize=(4,4)) 
ax = fig.add_subplot(111, title="Test scatter") 
alpha = 0.5 
ax.scatter(x1, y1, s=100, lw = 0, color=[1., alpha, alpha]) 
ax.scatter(x2, y2, s=100, lw = 0, color=[alpha, alpha, 1.]) 
plt.show() 

Die Überlappung zwischen den verschiedenen Farben sind auf diese Weise nicht enthalten, aber Sie bekommen,

enter image description here

+0

Bonus: es benötigt keine zusätzliche Bibliothek! – jvriesem

+0

Sie können jedoch das Rot nicht durch das Blau oder umgekehrt sehen. – sfjac

Verwandte Themen