У меня вопрос о том, как я могу использовать цикл для заполнения сетки matplotlib (2 на 2) с каждой итерацией алгоритма k средних (всего 4 итерации). Я новичок в Python и программировании в целом, поэтому я плохо понимаю, как это делать. Ниже приведен код (не весь) и текущий вывод, который я получаю. Спасибо!

lt.rcParams['figure.figsize'] = [10,5]

fig, ax = plt.subplots(2,2)

for itr in range(4): # set number of k-mean iterations
    # initialize distance and cluster membership
    cluster_ind = np.zeros(len(X))
    distance = np.zeros((len(X), k))
    
    for i, j in enumerate(C):
        distance[:, i] = EuclideanDistance(j, X)
        cluster_ind = np.argmin(distance, axis = 1)
    
    
    for i in range(k):
        C[i] = np.mean(X[cluster_ind == i], axis = 0)
    
        plt.scatter(X[:,0], X[:,1], s=8)
    

Результат выглядит следующим образом;

Выход участка

0
Freshzak187 30 Ноя 2020 в 11:22

1 ответ

Лучший ответ

Если вы хотите заполнить каждый подзаголовок, вы можете просто сделать это -

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
fig.suptitle('Sharing x per column, y per row')
ax1.plot(x, y)
ax2.plot(x, y**2, 'tab:orange')
ax3.plot(x, -y, 'tab:green')
ax4.plot(x, -y**2, 'tab:red')

for ax in fig.get_axes():
    ax.label_outer()

Конкретно для вашего кода, когда вы создаете команду subplot, создайте группу объектов subplot (ax1 ... ax4 в данном случае). Вместо того, чтобы иметь plt.scatter(X[:,0], X[:,1], s=8) внутри вашего цикла, используйте ax.scatter(X[:,0], X[:,1], s=8). (замените ax на ax1, если itr = 0, и ax2, если itr = 1, и так далее).

Чтобы быть более конкретным, в вашем коде я бы сделал это внутри вашего цикла,

if itr == 0:
    ax1.scatter(X[:,0], X[:,1], s=8)
elif itr == 1:
    ax2.scatter(X[:,0], X[:,1], s=8)
elif itr == 2:
    ax3.scatter(X[:,0], X[:,1], s=8)
elif itr == 3:
    ax4.scatter(X[:,0], X[:,1], s=8)

Я бы сделал это вместо того, чтобы делать plt.scatter(X[:,0], X[:,1], s=8).

(Фрагмент кода взят непосредственно из документации)

0
Ananda 30 Ноя 2020 в 09:03