2017-10-15 70 views
2

我有一個數據框,我想繪製。我想到了2個選項(檢查圖像)。如何使用factorplot來標註具有分類值的小節或繪製4個變量?

對於選項1,我需要註釋一個分類值(「Elec」)。

對於選項2,我仍然需要使用「factorplot」,但我不知道如何解決我得到的錯誤。

#CODE FOR THE DATAFRAME 
raw_data = {'Max_Acc': [90.71, 87.98, 92.62, 78.93, 73.69, 73.66, 72.29, 
         92.62, 94.17, 92.62, 83.81, 79.76, 74.40, 72.38], 
      'Stage': ['AWA', 'Rem', 'S1', 'S2', 'SWS', 'SX', 'ALL', 
         'AWA', 'Rem', 'S1', 'S2', 'SWS', 'SX', 'ALL'], 
      'Elec': ['Fp1', 'Fp2', 'C4', 'Cz', 'Pz', 'P4', 'T3', 
         'C4', 'T3', 'Fp1', 'P4', 'Fp2', 'Fz', 'Fz'], 
      'Clf': ['RF', 'RF', 'RF', 'RF', 'RF', 'RF', 'RF', 
        'XG', 'XG', 'XG', 'XG', 'XG', 'XG', 'XG']} 

df_m=pd.DataFrame(raw_data, columns = ['Max_Acc', 'Stage', 'Elec', 'Clf']) 

df_m 


#CODE FOR THE PLOT (OPTION 1) 
sns.set(style="white") 
g = sns.factorplot(x="Stage", y="Elec", hue='Clf', data=df, size=2, aspect=3, kind="bar", 
       legend=False) 


ax=g.ax 
def annotateBars(row, ax=ax): 
    for p in ax.patches: 
     ax.annotate("%.2f" % p.get_height(), (p.get_x() + p.get_width()/2., p.get_height()), 
     ha='center', va='center', fontsize=11, color='gray', rotation=90, xytext=(0, 20), 
     textcoords='offset points') 


plot = df_m.apply(annotateBars, ax=ax, axis=1) 



#CODE FOR THE PLOT (OPTION 2) 
g = sns.factorplot(x="Clf", y="Max_Acc", hue='Elec', col='Stage', data=df, size=2, aspect=3, kind="bar", 
       legend=False) 

OPTION 1(有分類值註解)

Option 1

OPTION 2(繪圖4個變量) Option 2

enter image description here

+0

什麼是錯誤您收到?我只是試過你的代碼,你的選項2對我來說工作的很好。 –

+0

您在圖像下方看到的情節是錯誤。酒吧是分開的,我不能註釋他們。 – Aizzaac

回答

-1

我沒有使用 「factorplot」。 我剛插入第二個x軸。

enter image description here

#To use seaborn palette 
palette = sns.color_palette("Set1", 8) 
sns.set(style="white") 

uelec, uind = np.unique(df["Elec"], return_inverse=1) 
cmap = plt.cm.get_cmap("Set1") 

colors= [ palette[i] for i in uind] 
fig, ax=plt.subplots(figsize=(15, 5)) 
l = len(df) 
pos = np.arange(0,l) % (l//2) + (np.arange(0,l)//(l//2)-1)*0.4 

ax.bar(pos, df["Max_Acc"], width=0.4, align="edge", ec="k", color=colors) 

handles=[plt.Rectangle((0,0),1,1, color=palette[i], ec="k") for i in range(len(uelec))] 

legend=ax.legend(bbox_to_anchor=(0., 1.15, 1., .102), handles=handles, labels=list(uelec), 
     prop ={'size':10}, loc=9, ncol=8, title=r'Best algorithm using Max_Acc after undersampling') 

legend.get_frame().set_linewidth(0.0) 
plt.setp(legend.get_title(),fontsize='24') 

ax.set_xticks(range(l//2)) 
ax.set_xticklabels(df["Stage"][:l//2]) 
ax.set_ylim(0, 110) 
ax.get_yaxis().set_visible(False) 
ax.spines['top'].set_visible(False) 

#Double x-axis 
ax.set_xticks(pos+0.2, minor=True) 
clf=df['Clf'].tolist() 
ax.set_xticklabels(clf, minor=True) 
plt.setp(ax.get_xticklabels(), rotation=0) 
ax.tick_params(axis='x', which='major', pad=25, size=0) 

ax=ax 
def annotateBars(row, ax=ax): 
    for p in ax.patches: 
     ax.annotate("%.2f" % p.get_height(), (p.get_x() + p.get_width()/2., p.get_height()), 
       ha='center', va='center', fontsize=11, color='gray', rotation=90, xytext=(0, 20), 
       textcoords='offset points') 

plot = df.apply(annotateBars, ax=ax, axis=1) 
相關問題