Построение линий разного цвета на основе столбца - PullRequest
1 голос
/ 14 января 2020

В настоящее время я работаю с фреймом данных, который выглядит следующим образом (у него 24 часа, здесь я показываю 2 часа):

Dataframe

На изображении показаны только первые 5 рядов, но есть 4 разных кластера и 3 разных класса. Кластеры были назначены независимо от класса, поэтому любой кластер может содержать строки, принадлежащие всем трем классам.

Мне нужно сделать столько линейных графиков, сколько у меня есть кластеров, где я могу показать кластеры центроид, а также все ряды, принадлежащие этому кластеру. Однако, что мне нужно - и я не могу найти способ сделать это - это нарисовать линию, принадлежащую каждому классу в кластере, другим цветом. Это означает, что каждый график будет иметь максимум 4 разных цвета, 1 для центроида и 1 для каждого класса.

Вот код, который я сейчас использую для построения графика центроида кластера, а также линий.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
import seaborn as sb
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin_min
from tslearn.clustering import TimeSeriesKMeans
from tslearn.datasets import CachedDatasets
from tslearn.preprocessing import TimeSeriesScalerMeanVariance

%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['figure.figsize'] = (16, 9)
plt.style.use('ggplot')
K = 4

X = np.array(dffinal[['h0','h1','h2','h3','h4','h5','h6','h7','h8','h9','h10','h11','h12','h13','h14','h15','h16','h17','h18','h19','h20','h21','h22','h23']])
y = np.array(dffinal.index)
euc_km = TimeSeriesKMeans(n_clusters=K,
                           metric='euclidean')
cluster = euc_km.fit_predict(X)
dffinal['cluster'] = cluster

for name, data in dffinal.groupby('cluster'):
    for xx in X[cluster == name]:
        plt.plot(euc_km.cluster_centers_[name].ravel(), "r-")
        plt.plot(xx.ravel(), "k-", alpha=.2)
    #plt.xlabel('Hour')
    #plt.ylabel('Demand')
    #plt.legend()
    plt.savefig('plot_euc_{}.png'.format(name))
    plt.close()

Это графики, полученные с текущим кодом:

Centroid in Red, All lines in Black

Я пытался включить второе условие после первого groupby во время графическое кодирование, но я не могу его осуществить.

Заранее спасибо

Редактировать: Я полагаю, я получил его, используя следующий код, на случай, если кто-то еще также столкнулся с той же проблемой.

    s = ['deepskyblue','darkorange','magenta']
for name, data in dffinal.groupby('cluster'):
    counter = -1
    for categoria, data in dffinal.groupby('clase'):
        counter = counter + 1
        for curve in Xc[(clase == categoria) & (cluster == name)]:
            plt.plot(curve.ravel(), s[counter], alpha=0.1)
    plt.plot(euc_km.cluster_centers_[name].ravel(), "r-")
    plt.savefig('plot_euc_{}.png'.format(name))
    plt.close()

Вот как выглядит мой последний график. У меня более 1450 строк данных, из которых около 1250 принадлежат к одному и тому же классу, поэтому большинство из них голубые, но где-то там еще можно увидеть апельсин и пурпурный цвет. Красный - все еще кластерный центроид. Надеюсь, это поможет любому делать что-то подобное. enter image description here

...