2015-05-07 24 views
7

Robię niektóre wykresy rozrzutu przy użyciu Matplotlib (python 3.4.0, matplotlib 1.4.3, działający pod Linux Mint 17). Łatwo ustawić przezroczystość alfa dla każdego punktu osobno; czy istnieje sposób na ustawienie ich jako grupy, tak aby dwa nakładające się punkty z tej samej grupy nie zmieniały koloru?Jak sprawić, by wykresy rozrzutu Matplotlib były przezroczyste jako grupa?

Przykładowy kod:

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

Wyniki w tego wyjścia:

enter image description here

ale chcę czegoś więcej jak ten:

enter image description here

mogę Obejście przez zapisywanie jako SV G i ręczne grupowanie, następnie w Inkscape, a następnie ustawianie przezroczystości, ale naprawdę wolałbym coś, co mogę kodować. Jakieś sugestie?

+0

Prawdopodobnie dlatego, że robi to, co sprzeczne rozrzutu jest zazwyczaj stara się pokazać. – cphlewis

Odpowiedz

5

Tak , interesujące pytanie. Możesz uzyskać ten wykres rozrzutu z Shapely. Oto kod:

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

a wynik jest:

Test scatter

nie
+1

Bardzo fajne wykorzystanie zgrabnej formy, której nigdy bym się nie spodziewał! Czy myślisz, że pakiet "descartes" uprościłby w ogóle kreślenie? –

+0

Dzięki! Tak, można użyć pakietu 'descartes'. Po 'cascaded_union': twórz łatki za pomocą' descartes.PolygonPatch', użyj 'matplotlib.collections.PathCollection' i zamień' add_patch' na 'add_collection'. Wykona to zadanie z mniejszą liczbą linii. – Flabetvibes

3

Interesujące pytanie, myślę, że każde użycie przezroczystości spowoduje efekt układania, którego chcesz uniknąć. Można ręcznie ustawić kolor typu przejrzystość, aby zbliżyć się do wyników, które chcesz,

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

Pokrycia pomiędzy różnymi kolorami nie są wliczone w ten sposób, ale można dostać,

enter image description here

+0

Bonus: nie wymaga dodatkowej biblioteki! – jvriesem

+0

Jednak nie widać czerwieni przez niebieski i na odwrót. – sfjac

Powiązane problemy