'How to plot just one label per ax.plot, when the argument of ax.plot is a list?

Having the following line in my plot code

ax.plot(x, pdf_individual, '--k', label = "single Gaussians")

, with pdf_individual being a list of lists, results in this picture:

enter image description here

Is there a way to just have "single Gaussians" once in the labels, instead of 6 times, which is the amount of single Gaussians for the Gaussian Mixture Model?

This is the whole post with the suggested solution

import matplotlib as mpl
import matplotlib.ticker as mtick
from matplotlib.lines import Line2D
mpl.rcParams['figure.dpi'] = 600

test_input =  input_list # THIS IS A 1D LIST with a few hundred items
X = np.asarray(test_input).reshape(-1,1)

N = np.arange(1, 11)
models = [None for i in range(len(N))]
for i in range(len(N)):
    models[i] = GaussianMixture(N[i]).fit(X)

# compute the AIC and the BIC
AIC = [m.aic(X) for m in models]
BIC = [m.bic(X) for m in models]



fig = plt.figure(figsize=(12, 4))
fig.subplots_adjust(left=0.1, right=0.9,
                    bottom=0.21, top=0.9, wspace=0.3)



ax = fig.add_subplot(131)
M_best = models[np.argmin(AIC)]
comp_count = str(M_best)
x = np.linspace(0, 0.1, 100)
logprob = M_best.score_samples(x.reshape(-1, 1))
responsibilities = M_best.predict_proba(x.reshape(-1, 1))
pdf = np.exp(logprob)
pdf_individual = responsibilities * pdf[:, np.newaxis]

                        
left, width = .245, .5
bottom, height = .4, .5
right = left + width
top = bottom + height
plt.setp( ax.xaxis.get_majorticklabels(), rotation=-45, ha="left" )
ax.yaxis.set_major_formatter(mtick.PercentFormatter())
ax.hist(X, 30, density=True, histtype='stepfilled', alpha=0.4, label="Data")
ax.plot(x, pdf, '-k', color = "red", label='GMM')
for i, pdf_individual in enumerate(pdf_individual):
    ax.plot(x, pdf_individual, '--k', label = "single Gaussians" if i == 0 else "")
#for pdf in pdf_individual[1:]: ax.plot(x, pdf, '--k')
ax.text(right, top, "Anzahl Komponenten: " + comp_count[-2],
        horizontalalignment='center',
        verticalalignment='bottom',
        transform=ax.transAxes)

ax.set_xlabel('$x$')
ax.set_ylabel('$p(x)$')

plt.legend()

plt.show()

It results in this error:

ValueError: x and y must have same first dimension, but have shapes (100,) and (6,)

EDIT:

Putting

pdf_individual = np.transpose(pdf_individual)

makes the code above work



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source