Matplotlib — графики накладываются друг на друга

#python #python-3.x #matplotlib #seaborn

#python #python-3.x #matplotlib #seaborn

Вопрос:

Я пытаюсь визуализировать две диаграммы Seaborn boxplots, используя метод fig (ax) следующим образом:

 import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


sns.set_palette('colorblind')
sns.set_style('white')



prd_data = pd.read_csv("Products 20171001-20200825.csv", sep=';', decimal=',')
prd_data['Product'].replace('Prd', 'Product ', regex=True, inplace=True)
prd_data_ess = prd_data.loc[prd_data['Base Type'] == 'ESS']
prd_data_premium = prd_data.loc[prd_data['Base Type'] == 'PRM']


fig, (ax0,ax1) = plt.subplots(2,1, figsize=(12,6), sharex=True, sharey=True)
ax0 = sns.boxplot(y='Product', x='Update Minutes', data=prd_data_ess, orient='h', 
                 order=['Product 1', 'Product 2', 'Product 3', 'Product 4'], 
                 boxprops=dict(alpha=0.3), color='#05BDC7')

ax0.set_xlim(0)
ax0.set_title('Products ESS - Update Minutes')
ax0.set(xlabel='')
ax0.set(ylabel='')
ax0.plot()

ax1 = sns.boxplot(y='Product', x='Update Minutes', data=prd_data_premium, orient='h', 
                  order=['Product 1', 'Product 2', 'Product 3', 'Product 4'], 
                  boxprops=dict(alpha=0.3), color='#E63322')

ax1.set_xlim(0)
ax1.set_title('Products PRM - Update Minutes')
ax1.set(xlabel='')
ax1.set(ylabel='')
ax1.plot()
plt.show
  

Но в итоге я получаю изображение, что ax0 является пустым, а данные как для ax0, так и для ax1 напечатаны на ax1, что делает второе изображение искаженным, вот так:

верхние значения, напечатанные на нижней диаграмме

Не могли бы вы подсказать мне, что может быть причиной проблемы?

Спасибо.

Комментарии:

1. Привет, Йохан, это решило проблему! Большое спасибо за вашу помощь! Не могли бы вы опубликовать свой ответ в качестве ответа? Похоже, вы добавили это в качестве комментария, и я не могу его повысить.

Ответ №1:

Вместо ax0 = sns.boxplot(...) вам нужно sns.boxplot(...., ax=ax0) и аналогично для второго графика: sns.boxplot(...., ax=ax1) .

По умолчанию seaborn использует «текущую ось» для построения графика. Вы можете использовать другой, ax указав ax= параметр. Seaborn также возвращает ax используемые им данные, которые затем могут быть использованы для изменения графика (настройки галочек, метки, …). Обратите внимание, что, когда не задано явное ax значение, несколько функций seaborn последовательно будут использовать одно и то же ax .

Также обратите внимание, что некоторые функции seaborn могут создавать полную сетку подзаголовков и возвращать FacetGrid объект вместо ax .