Seaborn boxplot with 2 y-axes

大憨熊 提交于 2019-12-10 19:47:53

问题


How can I create a seaborn boxplot with 2 y-axes? I need this because of different scales. My current code will overwrite the first box in the boxplot, eg. it is populated by 2 first data item from first ax and first item from second 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.


回答1:


It may not make too much sense to use seaborn here. Using usual matplotlib boxplots allows you to use the positions argument as expected.

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()



来源:https://stackoverflow.com/questions/47136855/seaborn-boxplot-with-2-y-axes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!