2017-03-04 7 views
1

Ich muss 2-dimensionale Verteilungen von 2 Gruppen vergleichen.Overlay Contour Plots in Matplotlib

Wenn ich matplotlib.pyplot.contourf verwende und die Diagramme überlagere, füllt die Hintergrundfarbe jedes Konturdiagramms den gesamten Zeichenbereich aus. Gibt es eine Möglichkeit, die unterste Kontur für jedes Konturdiagramm transparent zu machen, so dass das Zentrum jeder Kontur leichter zu sehen ist?

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import cm 
import scipy.stats as st 

def make_cloud(x, y, std, n=100): 
    x = np.random.normal(x, std, n) 
    y = np.random.normal(y, std, n) 
    return np.array(zip(x, y)) 

def contour_cloud(x, y, cmap): 
    xmin, xmax = -4, 4 
    ymin, ymax = -4, 4 

    xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j] 
    positions = np.vstack([xx.ravel(), yy.ravel()]) 
    values = np.vstack([x, y]) 
    kernel = st.gaussian_kde(values) 
    f = np.reshape(kernel(positions).T, xx.shape) 

    plt.contourf(xx, yy, f, cmap=cmap, alpha=0.5) 


cloud1 = make_cloud(-1, 1, 1) 
cloud2 = make_cloud(1, -1, 1) 

plt.scatter(x=cloud1[:,0], y=cloud1[:,1]) 
plt.scatter(x=cloud2[:,0], y=cloud2[:,1], color='red') 

fig = plt.gcf() 
ax = plt.gca() 

contour_cloud(x=cloud1[:, 0], y=cloud1[:, 1], cmap=cm.Blues) 
contour_cloud(x=cloud2[:, 0], y=cloud2[:, 1], cmap=cm.Reds) 

enter image description here

Antwort

1

Es gibt einige Steuerelemente, die Sie auf suchen contourf wollen. Sie können die verschiedenen Ebenen manuell ändern und die Farbkarte über/unter den Spezifikationen ändern. Standardmäßig scheint die Füllung für Bereiche unterhalb der niedrigsten Ebene (oder oberhalb der maximalen) transparent zu sein.

der einfachste Weg, dies zu tun, was Sie wollen, ist manuell die Ebenen angeben, und geben Sie sie so, dass es sind Punkte unterhalb der untersten Ebene, aber sind nicht alle Punkte über dem höchsten Niveau.

Wenn Sie ersetzen:

plt.contourf(xx, yy, f, cmap=cmap, alpha=0.5) 

mit:

step = 0.02 
m = np.amax(f) 
levels = np.arange(0.0, m, step) + step 
plt.contourf(xx, yy, f, levels, cmap=cmap, alpha=0.5) 

erzeugt ein Bild, wie: enter image description here

Für weitere Informationen über das Verhalten für Werte über/unter den colormap Werte, siehe here.

+0

Schön, danke! – Chris