我目前正在使用一个看起来像这样的数据框(它有24小时,这里我显示2小时):
该图像仅显示前5行,但是有4个不同的簇和3个不同的类。群集的分配与类别无关,因此任何群集都可以包含属于所有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()
这些是使用当前代码获得的图形:
我一直试图在图形编码过程中在第一个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左右属于同一类,这就是为什么大多数都是青色的原因,但是您仍然可以在其中看到橙色和洋红色。红色的仍然是簇质心。希望它能帮助任何人做类似的事情。