Как добавить несколько значений массива numpy в легенду сюжета? - PullRequest
1 голос
/ 07 марта 2019

Для моего эксперимента я использую KNN для классификации нескольких наборов данных (общий здесь для воспроизводимости).Ниже приведен мой исходный код.

import numpy as np
from numpy import genfromtxt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt




types = {
        "Data_G": ["datag_s.csv", "datag_m.csv"], 
        "Data_V": ["datav_s.csv", "datav_m.csv"], 
        "Data_C": ["datac_s.csv", "datac_m.csv"], 
        "Data_R": ["datar_s.csv", "datar_m.csv"]
        }

dataset = None
ground_truth = None

for idx, csv_list in types.items():
    for csv_f in csv_list:

        col_time,col_window = np.loadtxt(csv_f,delimiter=',').T
        trailing_window = col_window[:-1] # "past" values at a given index
        leading_window  = col_window[1:]  # "current values at a given index
        decreasing_inds = np.where(leading_window < trailing_window)[0]
        beta_value = leading_window[decreasing_inds]/trailing_window[decreasing_inds]
        quotient_times = col_time[decreasing_inds]

        my_data = genfromtxt(csv_f, delimiter=',')
        my_data = my_data[:,1]
        my_data = my_data[:int(my_data.shape[0]-my_data.shape[0]%200)].reshape(-1, 200)
        labels = np.full(1, idx)

        if dataset is None:
            dataset = beta_value.reshape(1,-1)[:,:15]
        else:
            dataset = np.concatenate((dataset,beta_value.reshape(1,-1)[:,:15]))

        if ground_truth is None:
            ground_truth = labels
        else:
            ground_truth = np.concatenate((ground_truth,labels))



X_train, X_test, y_train, y_test = train_test_split(dataset, ground_truth, test_size=0.25, random_state=42)

knn_classifier = KNeighborsClassifier(n_neighbors=3, weights='distance', algorithm='auto', leaf_size=300, p=2, metric='minkowski')
knn_classifier.fit(X_train, y_train)

Когда я делаю следующее

plot_data=dataset.transpose()
plt.plot(plot_data)

Создается следующий график.

enter image description here

Я добавил легенду к сюжету следующим образом:

plt.plot(plot_data, label=idx)
plt.legend()

enter image description here

Однако, как видно, этозаменяя все легенды на Data_R.Что я здесь не так делаю?

1 Ответ

1 голос
/ 07 марта 2019

Прежде чем ответить на этот вопрос, скажу одно: я всегда буду осторожен при просмотре словарей. До Python 3.6 словари не упорядочены, поэтому, если вам нужно гарантировать порядок в вашем словаре, вы должны использовать OrderedDict. Если вы используете Python3.6 +, тогда вам не о чем беспокоиться. Во всяком случае ...

После цикла for for idx, csv_list in types.items(): у нас всегда будет это idx = "Data_R" (учитывая, что ваш словарь упорядочен).

Итак, когда вы строите график с помощью plt.plot(plot_data, label=idx), метки всех линий будут установлены как "Data_R".

Вместо этого вы должны перебирать строки и добавлять к ним метки по одному.

for i, key in enumerate(types.keys()):
    plt.plot(plot_data[:, 2*i], label=key)
    plt.plot(plot_data[:, 2*i+1], label=key)

plt.legend()
...