Python 在不同范围的熊猫中组合多个方框图?

Python 在不同范围的熊猫中组合多个方框图?,python,pandas,data-visualization,boxplot,Python,Pandas,Data Visualization,Boxplot,我有两个数据集,一个表示根区(mm),另一个表示树覆盖率(%)。我能够并排绘制这些数据集(如下所示)。 使用的代码是: fig = plt.subplots(figsize = (16,7)) ax = [ plt.subplot(121), plt.subplot(122)] classified_data.boxplot(grid=False, rot=90, fontsize=10, ax = ax[0]) classifie

我有两个数据集,一个表示根区(mm),另一个表示树覆盖率(%)。我能够并排绘制这些数据集(如下所示)。 使用的代码是:

    fig = plt.subplots(figsize = (16,7))
    ax = [
        plt.subplot(121),
        plt.subplot(122)]
    classified_data.boxplot(grid=False, rot=90, fontsize=10, ax = ax[0])
    classified_treecover.boxplot(grid=False, rot=90, fontsize=10, ax = ax[1])
    ax[0].set_ylabel('Rootzone Storage Capacity (mm)', fontsize = '12')
    ax[1].set_ylabel('Tree Cover (%)', fontsize = '12')
    ax[0].set_title('Rootzone Storage Capacity (mm)')
    ax[1].set_title('Tree Cover (%)')

但是我想让它们在同一个图中,同时包含根区(在左侧y轴上)和树覆盖(在右侧y轴上),因为它们的范围不同(使用类似于
twinx()
)。但我希望它们在x轴上堆叠在一起,形成一个单独的类(如下所示,树木覆盖物有一个双y轴)。 有人能指导我如何用我的代码实现这一点吗??


要在同一个图形中绘制两个不同范围的数据集,需要将所有值转换为相应的z分数(标准化数据)。您可以使用
seaborn
boxplot()
函数中的
hue
参数并排绘制两个数据集。用MPG数据集考虑下面的例子。

   displacement  horsepower origin
0         307.0       130.0    usa
1         350.0       165.0    usa
2         318.0       150.0    usa
3         304.0       150.0    usa
4         302.0       140.0    usa

import seaborn as sns
import matplotlib.pyplot as plt

df = sns.load_dataset('mpg')

df1 = df[['displacement', 'origin']].copy()
df2 = df[['horsepower', 'origin']].copy()

# Convert values to z scores.
df1['z_score'] = df1['displacement'].\
apply(lambda x: (x - df1['displacement'].mean()) / df1['displacement'].std())
df2['z_score'] = df2['horsepower'].\
apply(lambda x: (x - df2['horsepower'].mean()) / df2['horsepower'].std())

df1.drop(['displacement'], axis= 1, inplace=True)
df2.drop(['horsepower'], axis=1, inplace=True)

# Add extra column to use it as the 'hue' parameter.
df1['value'] = 'displacement'
df2['value'] = 'horsepower'

df_cat = pd.concat([df1, df2])

ax = sns.boxplot(x='origin', y='z_score', hue='value', data=df_cat)

plt.yticks([])
ax.set_ylabel('')

# Add the left y axis.
ax1 = ax.twinx()
ax1.set_yticks(np.linspace(df['displacement'].min(), df['displacement'].max(), 5))
ax1.spines['right'].set_position(('axes', -0.2))
ax1.set_ylabel('displacement')

# Add the right y axis.
ax2 = ax.twinx()
ax2.set_yticks(np.linspace(df['horsepower'].min(), df['horsepower'].max(), 5))
ax2.spines['right'].set_position(('axes', 1))
ax2.set_ylabel('horsepower')
plt.show()

@Parfait能否请您详细说明您的问题。谢谢@Mykola Zotko,这个问题非常有效。但是你能帮我把它擦亮一点吗。(i) 有没有一种方法可以得到盒子本身的左手轴,和右手轴一样,所以它是对称的?(ii)我可以设置两个y轴的限制吗,因为现在看代码,它们似乎独立于方框图?@Ep1c1aN我不知道是否可以翻转左手轴。您可以使用ax1移动它。脊椎['right']。设置位置(('axes',0))。我没有回答第二个问题。您需要使用
matplotlib
设置。谢谢。但我仍然认为代码存在一些问题(或者它是如何为第二个y轴标准化的)。结果对我来说有点不对劲。但是这个方法很好。我会调查的,也许我错过了什么。