2017-01-23 13 views
5

Kiedy narysujesz pęczek przezroczystych linii w matplotlib, uzyskasz przyjemny efekt; kiedy się nakładają, są nieco ciemniejsze.Jak rysować przezroczyste linie, w których kolor staje się silniejszy, gdy się nakładają?

from pylab import * 
for _ in xrange(1000) : 
    plot(np.random.randn(2),np.random.randn(2),alpha=0.1,color='k') 
show() 

Wygląda to tak:

many lines overlapping

Ale jeśli narysować jedną długą linię tak, że pokrywa się ze sobą tak, linia nie „oddziałują ze sobą.” Wygląda to tak:

one line overlapping itself many times

Chciałbym zwrócić pojedynczą krzywą, która pokrywa się ze sobą tak, że im bardziej pokrywa się z samym sobą, tym ciemniejszy staje. Jeśli użyję pętli do podzielenia krzywej i narysowania każdego odcinka osobno, otrzymam to, co chcę, ale dostaję również brzydkie i niedopuszczalne artefakty, w których spotykają się segmenty linii, dzięki czemu krzywa wygląda jak przerywana lub przerywana linia. to:

best effort so far

Czy istnieje dobry sposób, aby narysować krzywą tak, że staje się ciemniejszy, gdy pokrywa się z siebie, ale nie dostaniesz artefakty, takie jak te właśnie opisane?

+0

Jak dokładnie wytworzyłeś trzeci obraz, który pokazuje te artefakty? – ImportanceOfBeingErnest

Odpowiedz

3

Podczas używania pętli do rozbicia krzywej i narysowania każdego odcinka oddzielnie, można spróbować użyć argumentu solid_capstyle do plot. Wartość domyślna to "projecting", ale możesz spróbować użyć opcji "butt" i sprawdzić, czy to pomaga.

plt.plot(x,y, alpha=0.1, c="k", solid_capstyle="butt") 

Może to nieco zmniejszyć efekt.

import matplotlib.pyplot as plt 
import numpy as np 

def squiggle_xy(a, b, c, d, i=np.arange(0.0, 2*np.pi, 0.05)): 
    return np.sin(i*a)*np.cos(i*b), np.sin(i*c)*np.cos(i*d) 

x,y = squiggle_xy(2.5, 2, 1, 3) 

fig, ax = plt.subplots(ncols=2, figsize=(6,3)) 
ax[0].set_title("solid_capstyle=\"projecting\"") 
ax[1].set_title("solid_capstyle=\"butt\"") 
for i in range(len(x)-1): 
    print x[i:i+2] 
    ax[0].plot(x[i:i+2], y[i:i+2], alpha=0.1, lw=10, solid_capstyle="projecting", c="b") 
    ax[1].plot(x[i:i+2], y[i:i+2], alpha=0.1, lw=10, solid_capstyle="butt", c="b") 

plt.show() 

enter image description here

Zobacz this question dobrego wyjaśnienia solid_capstyle.

+0

Działa to całkiem dobrze w przypadku cienkich linii. Dzięki! – weemattisnot

Powiązane problemy