beg*_*er_ 3 python matplotlib boxplot seaborn
如何创建带有 2 个 y 轴的 seaborn boxplot?我需要这个,因为不同的尺度。我当前的代码将覆盖箱线图中的第一个框,例如。它由第一个 ax 的 2 个第一个数据项和第二个 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
Run Code Online (Sandbox Code Playgroud)
如何防止第一项被覆盖?
编辑:
如果我添加位置参数
boxplot = sns.boxplot(ax=ax2, data=df[['B','C']], positions=[2,3])
Run Code Online (Sandbox Code Playgroud)
我得到一个例外:
TypeError: boxplot() got multiple values for keyword argument 'positions'
Run Code Online (Sandbox Code Playgroud)
可能是因为 seaborn 已经在内部设定了这个论点。
在这里使用 seaborn 可能没有太大意义。使用通常的 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()
Run Code Online (Sandbox Code Playgroud)