猿问

以列中绘制 x 轴的熊猫分组

我有一个时间序列的数据帧,其中列是时间值(按顺序),每行都是一个单独的序列。我还有额外的列,提供每行的类别,这反过来又决定了线型和颜色。


下面是数据帧:


>>> df

                cat (frac_norm, 2, 1)                                                                                                       cluster

month_rel                           -5        -4        -3        -2        -1         0         1          2         3         4          5        

user1   user2                                                                                                                                       

3414845 4232621  -1b          0.760675  0.789854   0.95941  0.867755  0.790102         1  0.588729   0.719073  0.695572  0.647696   0.656323       4

4369232 3370279  -1b          0.580436  0.546761   0.71343  0.742033  0.802198  0.389957  0.861451   0.651786  0.798265  0.476305   0.896072       0

22771   3795428  -1b          0.946188  0.499531  0.834885  0.825772  0.754018   0.67823  0.430692   0.353989  0.333761  0.284759   0.260501       2

2660226 3126314  -1b          0.826701   0.81203  0.765182  0.680162  0.763475  0.802632         1   0.780186  0.844019  0.868698   0.722672       4

4154510 4348009  -1b                 1  0.955656  0.677647  0.911556   0.76613  0.743759   0.61798   0.606536  0.715528  0.614902   0.482267       3

2860801 164553   -1b          0.870056  0.371981  0.640212  0.835185  0.673108  0.536585         1   0.850242  0.551198  0.873016   0.635556       4

120577  3480468  -1b            0.8197  0.879873  0.961178         1  0.855465  0.827824  0.827139   0.304011  0.574978  0.473996   0.358934       3

我可以制作下面的图,其中x轴是 的有序值,颜色取决于 的值,线型取决于 的值。但是,它是逐行的。有没有办法对此进行矢量化,例如,通过使用groupby?('frac_norm',2,1)clustercat

用于生成图像的代码


import pandas as pd

import numpy as np


colors = ['r','g','b','c','y','k']

lnst = ['-','--']

cats = np.sort(df['cat'].unique())

clusters = np.sort(df['cluster'].unique())

colordict = dict(zip(clusters, colors))

lnstdict = dict(zip(cats,lnst))



泛舟湖上清波郎朗
浏览 60回答 1
1回答

Cats萌萌

你应该能够使用熊猫来绘制并避免循环:from matplotlib.colors import LinearSegmentedColormapcolors = ['r','g','b','c','y','k']lnst = ['-','--']cats = np.sort(df['cat'].unique())clusters = np.sort(df['cluster'].unique())colordict = dict(zip(clusters, colors))lnstdict = dict(zip(cats,lnst))# transpose data framedf1 = df.T# map colors from colordict to clustercmap = df['cluster'].map(colordict).values.tolist()# create a custom color map and line stylelscm = LinearSegmentedColormap.from_list('color', cmap)lstyle = df['cat'].map(lnstdict).values.tolist()# plot with pandas df1.iloc[1:12].reset_index(level=0, drop=True).plot(figsize=(20,10),                                                    colormap=lscm,                                                    style=lstyle)更新(假设您希望两者都在同一图表上)from matplotlib.colors import LinearSegmentedColormapimport matplotlib.pyplot as plt%matplotlib inlinecolors = ['r','g','b','c','y','k']lnst = ['-','--']cats = np.sort(df['cat'].unique())clusters = np.sort(df['cluster'].unique())colordict = dict(zip(clusters, colors))lnstdict = dict(zip(cats,lnst))# transpose data framedf1 = df.T# map colors from colordict to clustercmap = df['cluster'].map(colordict).values.tolist()# create a custom color map and line stylelscm = LinearSegmentedColormap.from_list('color', cmap)lstyle = df['cat'].map(lnstdict).values.tolist()c = df.columns# not needed for your actually dataframe# i am just converting your sample data to numericfor i in range(len(df.columns[1:])-1):    df[c[i+1]] = pd.to_numeric(df[c[i+1]])# groupby and get mean of clusterdf2 = df[c[1:]].groupby('cluster').mean()# create sublots object from matplotlibfig, ax = plt.subplots()# add a twin y-axisax2 = ax.twiny()# plot dataframe 1df1.iloc[1:12].reset_index(level=0, drop=True).plot(ax=ax, figsize=(20,10),                                                    colormap=lscm,                                                    style=lstyle)# create legend for axhandles, labels = ax.get_legend_handles_labels()ax.legend(handles, labels, loc='center left', borderaxespad=-20)# subplot df2df2.plot(ax=ax2, colormap='copper')# create legend for ax2handles, labels = ax2.get_legend_handles_labels()ax2.legend(handles, labels, loc='center right', borderaxespad=-20)
随时随地看视频慕课网APP

相关分类

Python
我要回答