我有2个数据集,一个代表根区(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 (%)')
但是我想让它们与Rootzone(在左侧y轴上)和Tree Cover(在右侧y轴上)都处于同一图中,因为它们的范围不同(使用twinx()
)。但我希望将它们堆叠在一起,以便在x轴上放置一个类(如下所示,树形覆盖物用一个双y轴显示)。有人可以指导我如何用我的代码实现吗?
要在同一图中绘制两个具有不同范围的数据集,您需要将所有值转换为相应的z分数(标准化数据)。您可以hue
在boxplot()
函数in中使用参数seaborn
来并排绘制两个数据集。考虑以下带有“ 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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句