Добавьте итерационную легенду к функции python - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть 2 функции: «одна функция вызывает другого» для построения некоторых кривых. Я хочу иметь легенды об этих функциях, которые можно рассматривать как единое целое на последнем сюжете, но я не могу этого достичь. Может кто-то помочь мне с этим? Код ниже (отлично работает без надписей / надписей).

import matplotlib.colors as mcolors
from matplotlib.patches import Polygon

def gradient_fill(x, y, fill_color=None, ax=None, label = None, **kwargs):
    """
    Plot a line with a linear alpha gradient filled beneath it.

    Parameters
    ----------
    x, y : array-like
        The data values of the line.
    """
    if ax is None:
        ax = plt.gca()

    line, = ax.plot(x, y, **kwargs, color='black', lw = 1.5)
    if fill_color is None:
        fill_color = line.get_color()

    zorder = line.get_zorder()
    alpha = line.get_alpha()
    alpha = 1.0 if alpha is None else alpha

    z = np.empty((100, 1, 4), dtype=float)
    rgb = mcolors.colorConverter.to_rgb(fill_color)
    z[:,:,:3] = rgb
    z[:,:,-1] = np.linspace(0, alpha, 100)[:,None]

    xmin, xmax, ymin, ymax = x.min(), x.max(), y.min(), y.max()
    im = ax.imshow(z, aspect='auto', extent=[xmin, xmax, ymin, ymax*1.12],
                   origin='lower', zorder=zorder,alpha = 0.8, label = label)
    ax.legend([str(label)])    
    xy = np.column_stack([x, y])
    xy = np.vstack([[xmin, ymin], xy, [xmax, ymin], [xmin, ymin]])
    clip_path = Polygon(xy, facecolor='none', edgecolor= None, closed=True)
    ax.add_patch(clip_path)
    im.set_clip_path(clip_path)
    ax.autoscale(True)
    return line, im

def gaussian_kde(data,bandwidth = 20,x_range_st = -50,x_range_end = 1000, N = 1000, fill_color = None, label = None):
    from sklearn.neighbors import KernelDensity
    # instantiate and fit the KDE model
    kde = KernelDensity(bandwidth=bandwidth, kernel='gaussian')
    kde.fit(data[:, None])
    x_d = np.linspace(x_range_st, x_range_end, N)
    # score_samples returns the log of the probability density
    logprob = kde.score_samples(x_d[:, None])
    #plt.fill_between(x_d, np.exp(logprob), alpha=0.5)
    gradient_fill(x_d,np.exp(logprob), fill_color = fill_color, label = label)
    plt.gca().invert_yaxis()

Пример кода:

gaussian_kde(data1, label = 'Apple')
gaussian_kde(data2, label = 'Banana', fill_color = 'red')
gaussian_kde(data3, label = 'Mango', fill_color = 'green')

enter image description here

Я хочу добавить метку непосредственно в функцию gaussian_kde, чтобы она появилась на последнем рисунке. Я получаю ошибку с кодом TypeError: zip argument #2 must support iteration. Код работает нормально, но отображает только последнюю метку . Может ли кто-нибудь дать несколько советов о том, как получить все метки, как это определено на рисунке?

...