2015-05-07 17 views
7

Sto creando alcuni scatterplot usando Matplotlib (python 3.4.0, matplotlib 1.4.3, in esecuzione su Linux Mint 17). È abbastanza facile impostare la trasparenza alfa per ogni punto singolarmente; esiste un modo per impostarli come gruppo, in modo che due punti sovrapposti dello stesso gruppo non cambino il colore?Come rendere trasparenti i grafici a dispersione Matplotlib come gruppo?

codice Esempio:

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") 

I risultati in questa uscita:

enter image description here

ma voglio qualcosa di più come questo:

enter image description here

posso aggirare da salvando come SV G e quindi raggruppare manualmente in Inkscape, quindi impostare la trasparenza, ma preferirei davvero qualcosa che posso codificare. Eventuali suggerimenti?

+0

Probabilmente, perché fare che è in contrasto con ciò che un grafico a dispersione è di solito cercando di mostrare. – cphlewis

risposta

5

Sì , domanda interessante. È possibile ottenere questo scatterplot con Shapely. Ecco il codice:

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") 

e il risultato è:

Test scatter

non
+1

Ottimo uso di shapely dove non me lo sarei mai aspettato! Pensi che il pacchetto 'descartes' semplificherebbe il disegno? –

+0

Grazie! Sì, il pacchetto 'descartes' può essere usato. Dopo il 'cascaded_union': creare patch con' descartes.PolygonPatch', usare 'matplotlib.collections.PathCollection' e sostituire' add_patch' con 'add_collection'. Questo farà il lavoro con meno linee. – Flabetvibes

3

Interessante domanda, penso che qualsiasi utilizzo della trasparenza comporterà l'effetto di impilamento che si desidera evitare. È possibile impostare manualmente un colore tipo di trasparenza per avvicinarsi ai risultati desiderati,

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() 

La sovrapposizione tra i diversi colori non sono inclusi in questo modo, ma si ottiene,

enter image description here

+0

Bonus: non richiede una libreria aggiuntiva! – jvriesem

+0

Non è possibile vedere il rosso attraverso il blu o viceversa. – sfjac

Problemi correlati