Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x seaborn成对箱线图中的控制标记属性_Python 3.x_Pandas_Seaborn_Boxplot - Fatal编程技术网

Python 3.x seaborn成对箱线图中的控制标记属性

Python 3.x seaborn成对箱线图中的控制标记属性,python-3.x,pandas,seaborn,boxplot,Python 3.x,Pandas,Seaborn,Boxplot,我试图在同一个图上绘制两个不同数据集的箱线图。x轴是一天中的小时数,而y轴是从0到1(我们称之为效率)。我希望每个数据集框的平均值有不同的标记。我对seaborn使用“meanprops”,但这同时改变了两个数据集的标记样式。我在excel中添加了2000行可以下载的数据。这些值可能与图片中的值不一致,但应该足够了 基本上,我希望红色方块在橙色方框图上是蓝色的,在蓝色方框图上是红色的。以下是我迄今为止所做的工作: 我试图通过使用一个以标签为键的字典来改变meanprops,但它似乎进入了一个循

我试图在同一个图上绘制两个不同数据集的箱线图。x轴是一天中的小时数,而y轴是从0到1(我们称之为效率)。我希望每个数据集框的平均值有不同的标记。我对seaborn使用“meanprops”,但这同时改变了两个数据集的标记样式。我在excel中添加了2000行可以下载的数据。这些值可能与图片中的值不一致,但应该足够了

基本上,我希望红色方块在橙色方框图上是蓝色的,在蓝色方框图上是红色的。以下是我迄今为止所做的工作:

我试图通过使用一个以标签为键的字典来改变meanprops,但它似乎进入了一个循环(在PyCharm中是这样说的…)

我也试过了,但没用(停在“评估…”):


感谢您的帮助

我认为您不能直接使用
sns.boxplot()
来实现这一点。我想你得“用手”画出方法


我认为您不能直接使用
sns.boxplot()
来实现这一点。我想你得“用手”画出方法


这很好,但是当使用
showmeans=True
时,平均值似乎是反向的,即蓝点位于y轴的正确位置,而不是x轴(应位于橙色框上)。我试着摆弄它,但你在拉链上绕来绕去的方式让我很难受,现在我超级累了。你能建议一个解决方法吗?谢谢,你说得对。对不起,我弄错了,我更正了我的答案。错误在最后一行,我应该用writer
..+o
而不是
..-o
如果您有时间,请您也检查一下这个问题好吗?这很好,但是当使用
showmeans=True
时,平均值似乎是反向的,即蓝点位于y轴上的正确位置,但不在x轴上(应位于橙色框上)。我试着摆弄它,但你在拉链上绕来绕去的方式让我很难受,现在我超级累了。你能建议一个解决方法吗?谢谢,你说得对。对不起,我弄错了,我更正了我的答案。错误在最后一行,我应该用writer
..+o
而不是
..-o
如果您有时间,请您也检查一下这个问题好吗?
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

#make sure you have your path sorted out
group1 = pd.read_excel('group1.xls')

ax,fig = plt.subplots(figsize = (20,10))

#does not work
#ax = sns.boxplot(data=group1, x='hour', y='M1_eff', hue='labels',showfliers=False, showmeans=True,\
#                 meanprops={"marker":{'7':"s",'8':'s'},"markerfacecolor":{'7':"white",'8':'white'}, 
#"markeredgecolor":{'7':"blue",'8':'red'})

#works but produces similar markers
ax = sns.boxplot(data=group1, x='hour', y='M1_eff', hue='labels',showfliers=False, showmeans=True,\
             meanprops={"marker":"s","markerfacecolor":"white", "markeredgecolor":"blue"})

plt.legend(title='Groups', loc=2, bbox_to_anchor=(1, 1),borderaxespad=0.5)

# Add transparency to colors
for patch in ax.artists:
     r, g, b, a = patch.get_facecolor()
     patch.set_facecolor((r, g, b, .4))
ax.set_xlabel("Hours",fontsize=14)
ax.set_ylabel("M1 Efficiency",fontsize=14)
ax.tick_params(labelsize=10)
plt.show()
g = sns.FacetGrid(group1, col="M1_eff", hue="labels",hue_kws=dict(marker=["^", "v"]))
g = (g.map(plt.boxplot, "hour", "M1_eff")
     .add_legend())
g.show()
N=100
df = pd.DataFrame({'hour':np.random.randint(0,3,size=(N,)),
                   'M1_eff': np.random.random(size=(N,)),
                   'labels':np.random.choice([7,8],size=(N,))})

x_col = 'hour'
y_col = 'M1_eff'
hue_col = 'labels'
width = 0.8
hue_order=[7,8]

marker_colors = ['red','blue']

# get the offsets used by boxplot when hue-nesting is used
# https://github.com/mwaskom/seaborn/blob/c73055b2a9d9830c6fbbace07127c370389d04dd/seaborn/categorical.py#L367
n_levels = len(hue_order)
each_width = width / n_levels
offsets = np.linspace(0, width - each_width, n_levels)
offsets -= offsets.mean()

fig, ax = plt.subplots()
ax = sns.boxplot(data=df, x=x_col, y=y_col, hue=hue_col, hue_order=hue_order, showfliers=False, showmeans=False)

means = df.groupby([hue_col,x_col])[y_col].mean()
for (gr,temp),o,c in zip(means.groupby(level=0),offsets,marker_colors):
    ax.plot(np.arange(temp.values.size)+o, temp.values, 's', c=c)