Python 3.x 如何在seaborn';在python中,将1个变量与多个变量进行比较时,是否使用s factorplot?

Python 3.x 如何在seaborn';在python中,将1个变量与多个变量进行比较时,是否使用s factorplot?,python-3.x,pandas,matplotlib,data-visualization,seaborn,Python 3.x,Pandas,Matplotlib,Data Visualization,Seaborn,我想画一个图来比较一个变量(Fp1)和其他5个变量。 我怎样才能使钢筋连接起来?我怎样才能消除他们之间的空隙?有办法吗 数据帧: 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

我想画一个图来比较一个变量(Fp1)和其他5个变量。 我怎样才能使钢筋连接起来?我怎样才能消除他们之间的空隙?有办法吗

数据帧:

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', 'Fp1', 'Fp1', 'Fp1', 'Fp1', 'Fp1', 'Fp1',
                 'C4', 'T3', 'Fp1', 'P4', 'Fp2', 'Fz', 'Fz']}

df_m=pd.DataFrame(raw_data, columns = ['Max_Acc', 'Stage', 'Elec'])
生成绘图的代码:

#Seaborn 
sns.set(style="white")
g = sns.factorplot(x="Stage", y="Mean_Acc", hue='Clf', data=df, size=4, aspect=3, kind="bar",
           legend=False) 

g.set(ylim=(0, 120)) 
g.despine(right=False) 
g.set_xlabels("") 
g.set_ylabels("") 
g.set_yticklabels("") 


mylegend=plt.legend(bbox_to_anchor=(0., 1.1, 1., .102), prop ={'size':10}, loc=10, ncol=8, #left, bottom, width,
            title=r'BEST STAGE AFTER OPTIMIZATION')                                #height, loc='center'
mylegend.get_title().set_fontsize('24') 



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)
情节:

编辑 因此,在阅读了答案后,我做了一些改进。但是我怎样才能使图例中的颜色与条形图中的颜色相匹配呢?我只有2种颜色,但应该是6种

编辑:使用与答案相同的代码

编辑:

因此,我升级了Matplotlib,并添加了注释这些条的代码


factorplot在条形图子组中为
hue
参数列中的每个唯一项保留一个位置。因此,可以引入一个只包含两个不同值的新列

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn.apionly as sns

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', 'Fp1', 'Fp1', 'Fp1', 'Fp1', 'Fp1', 'Fp1',
                 'C4', 'T3', 'Fp1', 'P4', 'Fp2', 'Fz', 'Fz']}

df_m=pd.DataFrame(raw_data, columns = ['Max_Acc', 'Stage', 'Elec'])
df_m["hue"] = np.arange(0,len(df_m)) // (len(df_m)//2)

g = sns.factorplot(x="Stage", y="Max_Acc", hue="hue", data=df_m, size=4,
                     aspect=3, kind="bar", legend=False)

plt.show()

然后需要对matplotlib进行大量调整以恢复颜色

此时,您可能决定无论如何使用matplotlib条形图

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

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', 'Fp1', 'Fp1', 'Fp1', 'Fp1', 'Fp1', 'Fp1',
                 'C4', 'T3', 'Fp1', 'P4', 'Fp2', 'Fz', 'Fz']}

df_m=pd.DataFrame(raw_data)


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

fig, ax=plt.subplots()
l = len(df_m)
pos = np.arange(0,l) % (l//2) + (np.arange(0,l)//(l//2)-1)*0.4
ax.bar(pos, df_m["Max_Acc"], width=0.4, align="edge", ec="k", color=cmap(uind)  )

handles=[plt.Rectangle((0,0),1,1, color=cmap(i), ec="k") for i in range(len(uelec))]
ax.legend(handles=handles, labels=list(uelec),
           prop ={'size':10}, loc=9, ncol=8, 
            title=r'BEST STAGE AFTER OPTIMIZATION')

ax.set_xticks(range(l//2))
ax.set_xticklabels(df_m["Stage"][:l//2])
ax.set_ylim(0, 120)
plt.show()

要从seaborn调色板获取颜色,可以使用

palette = sns.color_palette()
colors= [ palette[i] for i in uind]

...
ax.bar(..., color=colors)
...

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

factorplot在条形图子组中为
hue
参数指定的列中的每个唯一项保留一个位置。因此,可以引入一个只包含两个不同值的新列

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn.apionly as sns

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', 'Fp1', 'Fp1', 'Fp1', 'Fp1', 'Fp1', 'Fp1',
                 'C4', 'T3', 'Fp1', 'P4', 'Fp2', 'Fz', 'Fz']}

df_m=pd.DataFrame(raw_data, columns = ['Max_Acc', 'Stage', 'Elec'])
df_m["hue"] = np.arange(0,len(df_m)) // (len(df_m)//2)

g = sns.factorplot(x="Stage", y="Max_Acc", hue="hue", data=df_m, size=4,
                     aspect=3, kind="bar", legend=False)

plt.show()

然后需要对matplotlib进行大量调整以恢复颜色

此时,您可能决定无论如何使用matplotlib条形图

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

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', 'Fp1', 'Fp1', 'Fp1', 'Fp1', 'Fp1', 'Fp1',
                 'C4', 'T3', 'Fp1', 'P4', 'Fp2', 'Fz', 'Fz']}

df_m=pd.DataFrame(raw_data)


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

fig, ax=plt.subplots()
l = len(df_m)
pos = np.arange(0,l) % (l//2) + (np.arange(0,l)//(l//2)-1)*0.4
ax.bar(pos, df_m["Max_Acc"], width=0.4, align="edge", ec="k", color=cmap(uind)  )

handles=[plt.Rectangle((0,0),1,1, color=cmap(i), ec="k") for i in range(len(uelec))]
ax.legend(handles=handles, labels=list(uelec),
           prop ={'size':10}, loc=9, ncol=8, 
            title=r'BEST STAGE AFTER OPTIMIZATION')

ax.set_xticks(range(l//2))
ax.set_xticklabels(df_m["Stage"][:l//2])
ax.set_ylim(0, 120)
plt.show()

要从seaborn调色板获取颜色,可以使用

palette = sns.color_palette()
colors= [ palette[i] for i in uind]

...
ax.bar(..., color=colors)
...

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

只有当您没有每个组和每个色调的值时,才会出现此问题。您可以使用dodge=False最小化条间距

及 如果还想添加条值,则需要根据色调设置高度。 否则它将给出一个类似“ValueError:posx和posy应该是有限值”的错误


只有当您没有每个组和每个色调的值时,才会出现此问题。您可以使用dodge=False最小化条间距

及 如果还想添加条值,则需要根据色调设置高度。 否则它将给出一个类似“ValueError:posx和posy应该是有限值”的错误


有没有办法在seaborn做到这一点?或者至少在matplotlib中注释每个条?你说的“在seaborn中”是什么意思?注释已经在问题的代码中。我认为没有必要在答案中重复那部分代码。最后一个。当你说我应该使用matplotlib bar plot时。我已经添加了图像。您有旧版本的matplotlib。我无法对此进行测试,因此您可以尝试规范化
color=cmap(uind/float(len(uind))
或扩展
color=cmap(uind*256//len(uind))
。我猜其中一个可行。我还更新了关于如何使用seaborn调色板的答案,如果这就是你所说的“在seaborn”的意思。有没有办法在seaborn中做到这一点?或者至少在matplotlib中注释每个条?你说的“在seaborn中”是什么意思?注释已经在问题的代码中。我认为没有必要在答案中重复那部分代码。最后一个。当你说我应该使用matplotlib bar plot时。我已经添加了图像。您有旧版本的matplotlib。我无法对此进行测试,因此您可以尝试规范化
color=cmap(uind/float(len(uind))
或扩展
color=cmap(uind*256//len(uind))
。我猜其中一个可行。我还更新了关于如何使用seaborn调色板的答案,如果这就是你所说的“在seaborn”的意思的话。