简体   繁体   English

Seaborn箱形图,有2个y轴

[英]Seaborn boxplot with 2 y-axes

How can I create a seaborn boxplot with 2 y-axes? 如何创建一个带有2个y轴的seaborn boxplot? I need this because of different scales. 因为尺度不同,我需要这个。 My current code will overwrite the first box in the boxplot, eg. 我当前的代码将覆盖boxplot中的第一个框,例如。 it is populated by 2 first data item from first ax and first item from second ax. 它由第一个ax的第一个数据项和第二个ax的第一个项填充。

import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
import seaborn as sns

df = pd.DataFrame({'A': pd.Series(np.random.uniform(0,1,size=10)),
                   'B': pd.Series(np.random.uniform(10,20,size=10)),
                   'C': pd.Series(np.random.uniform(10,20,size=10))})

fig = plt.figure()
# 2/3 of  A4
fig.set_size_inches(7.8, 5.51)

plt.ylim(0.0, 1.1)

ax1 = fig.add_subplot(111)

ax1 = sns.boxplot(ax=ax1, data=df[['A']])

ax2 = ax1.twinx()

boxplot = sns.boxplot(ax=ax2, data=df[['B','C']])

fig = boxplot.get_figure()
fig

在此输入图像描述

How do I prevent the first item getting overwritten? 如何防止第一项被覆盖?

EDIT: 编辑:

If I add positions argument 如果我添加职位论证

boxplot = sns.boxplot(ax=ax2, data=df[['B','C']], positions=[2,3])

I get an exception: 我得到一个例外:

TypeError: boxplot() got multiple values for keyword argument 'positions'

Probably because seaborn already sets that argument internally. 可能是因为seaborn已经在内部设定了这个论点。

It may not make too much sense to use seaborn here. 在这里使用seaborn可能没有多大意义。 Using usual matplotlib boxplots allows you to use the positions argument as expected. 使用通常的matplotlib boxplots允许您按预期使用positions参数。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')

df = pd.DataFrame({'A': pd.Series(np.random.uniform(0,1,size=10)),
                   'B': pd.Series(np.random.uniform(10,20,size=10)),
                   'C': pd.Series(np.random.uniform(10,20,size=10))})

fig, ax1  = plt.subplots(figsize=(7.8, 5.51))

props = dict(widths=0.7,patch_artist=True, medianprops=dict(color="gold"))
box1=ax1.boxplot(df['A'].values, positions=[0], **props)

ax2 = ax1.twinx()
box2=ax2.boxplot(df[['B','C']].values,positions=[1,2], **props)

ax1.set_xlim(-0.5,2.5)
ax1.set_xticks(range(len(df.columns)))
ax1.set_xticklabels(df.columns)

for b in box1["boxes"]+box2["boxes"]:
    b.set_facecolor(next(ax1._get_lines.prop_cycler)["color"])
plt.show()

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM