2014-11-02 14 views
5

contour işlevinin kullandığı renk eşlemesine göre bir noktayı renklendirmenin bir yolu var mı? Bir renk haritası belirtebileceğimin farkındayım, ancak muhtemelen contour işlevi bazı verilerin ölçeklendirilmesini ve/veya normalleştirilmesini sağlıyor mu? ... değerler Buna göreRenk noktaları kontür rengine göre

import numpy as np 
import scipy.stats as ss 

def plot_2d_probsurface(data, resolution=20, ax = None, xlim=None, ylim=None): 
    # create a function to calcualte the density at a particular location 
    kde = ss.gaussian_kde(data.T) 

    # calculate the limits if there are no values passed in 
    # passed in values are useful if calling this function 
    # systematically with different sets of data whose limits 
    # aren't consistent 
    if xlim is None: 
     xlim = (min(data[:,0]), max(data[:,0])) 

    if ylim is None: 
     ylim = (min(data[:,1]), max(data[:,1])) 

    # create some tick marks that will be used to create a grid 
    xs = np.linspace(xlim[0], xlim[1], resolution) 
    ys = np.linspace(ylim[0], ylim[1], resolution) 

    # wrap the KDE function and vectorize it so that we can call it on 
    # the entire grid at once 
    def calc_prob(x,y): 
     return kde([x,y])[0] 
    calc_prob = vectorize(calc_prob) 

    # check if we've received a plotting surface 
    if ax is None: 
     fig = plt.figure(figsize=(6,6)) 
     ax = fig.add_subplot(1,1,1) 

    # create the grid and calculate the density at each point 
    X,Y = np.meshgrid(xs, ys) 
    Z = calc_prob(X,Y) 

    # the values according to which the points should be colored 
    point_values = kde(data.T) 

    # plot the contour 
    cont = ax.contour(X,Y,Z) 
    #print cont 
    ax.plot(data[:,0], data[:,1], 'o') 

    return (None, None) 

data_x = np.random.random((50,2)) 
cont = plot_2d_probsurface(data_x) 

Yani aşağıda arsa içinde, en yüksek yoğunluklu noktaları renkli olacağını kahverengi, sonraki turuncu, sonraki sarı, vs: Burada

bir örnek noktalar renkli olmalıdır point_values. Bu sadece renklere dönüştürülmeli ve plot işlevine geçirilmelidir. Ama onları contour çiziminde nasıl ölçeklendiririm?

enter image description here

scatter için plot değişen ve c=point_values parametre olarak nokta değerleri geçen kadar basit gibi görünen

cevap

5

: Bu sonuçla

import numpy as np 
import scipy.stats as ss 

def plot_2d_probsurface(data, resolution=20, ax = None, xlim=None, ylim=None): 
    # create a function to calcualte the density at a particular location 
    kde = ss.gaussian_kde(data.T) 

    # calculate the limits if there are no values passed in 
    # passed in values are useful if calling this function 
    # systematically with different sets of data whose limits 
    # aren't consistent 
    if xlim is None: 
     xlim = (min(data[:,0]), max(data[:,0])) 

    if ylim is None: 
     ylim = (min(data[:,1]), max(data[:,1])) 

    # create some tick marks that will be used to create a grid 
    xs = np.linspace(xlim[0], xlim[1], resolution) 
    ys = np.linspace(ylim[0], ylim[1], resolution) 

    # wrap the KDE function and vectorize it so that we can call it on 
    # the entire grid at once 
    def calc_prob(x,y): 
     return kde([x,y])[0] 
    calc_prob = vectorize(calc_prob) 

    # check if we've received a plotting surface 
    if ax is None: 
     fig = plt.figure(figsize=(6,6)) 
     ax = fig.add_subplot(1,1,1) 

    # create the grid and calculate the density at each point 
    X,Y = np.meshgrid(xs, ys) 
    Z = calc_prob(X,Y) 

    # plot the contour 
    cont = ax.contour(X,Y,Z) 
    point_values = kde(data.T) 
    print point_values 
    #print cont 
    ax.scatter(data[:,0], data[:,1], c=point_values) 

    return (None, None) 

data_x = np.random.random((50,2)) 
cont = plot_2d_probsurface(data_x) 

:

enter image description here

+2

Kudos kendi sorunuzu cevaplamak için! Sadece FYI: Renkler tam olarak eşleşmeyecek. Kontür renkler, min ve maksimum kontura ölçeklenirken, dağılım renkleri min ve maksimum değerlere ölçeklendirilir. Bunun etrafında hızlı bir şekilde "cont = ax.contour (...)' ve "ax.scatter (x, y, c = z, cmap = cont.cmap, norm = cont.norm)" gibi bir şey yapmaktır. '. Bu, renklendirmeyi (konturun kullanacağı gibi) ayırmak yerine sürekli bir sürekli verecektir, ancak ölçekleme aynı olacaktır. (Eğer gerçekten ayrı bir renk eşlemesine ihtiyacınız varsa, 'plt.get_cmap (" name ", N)' kullanın.) –

+0

Teşekkürler! Tam olarak ne soruyordum. Bunu bir cevap olarak formüle etmek istiyorsanız, bunu sorduğum soruya daha doğru ve kesin bir cevap olduğu için kabul edeceğim :) –

İlgili konular