нарисуйте прямоугольник и узкий график для данных, разделенных на ячейки

#python #matplotlib #plot #seaborn #boxplot

#python #matplotlib #график #seaborn #boxplot

Вопрос:

У меня есть фрейм данных с двумя столбцами (f1 и f2). Вы можете создать образец фрейма данных с помощью:

 
# intialise data of lists. 
data = {'f1':[20,183,19,45,9173,11,482], 
        'f2':[771,8773,91,837,917,891,11]} 
  
# Create DataFrame 
d = pd.DataFrame(data) 
  
# Print the output. 
d 

 

Я разделил фрейм данных на 20 ячеек, используя следующий код:

 d['feature2'].value_counts(bins=20, sort=False)
 

Однако вышеупомянутая строка кода дает мне количество в каждой ячейке. Я хочу разделить фрейм данных на 20 ячеек, а затем нарисовать прямоугольник и график усов для каждой ячейки для обеих функций.

Я знаю, что у hexbin, hist2d есть параметр nbins:

 
fig, axes = plt.subplots(ncols=2, nrows=1, figsize=(21, 5))

nbins = 40
axes[0].set_title('Hexbin')
axes[0].hexbin(d.f1, d.f2, gridsize=nbins, cmap=plt.cm.BuGn_r)

# 2D Histogram
axes[1].set_title('2D Histogram')
axes[1].hist2d(d.f1, d.f2, bins=nbins, cmap=plt.cm.BuGn_r)

 

Но для Boxplot этого не существует. Поэтому я хочу разделить свой фрейм данных на 20 ячеек, и для каждой ячейки я хочу построить прямоугольник и график усов для двух столбцов. Как я могу этого добиться. Идеи будут оценены.

Редактировать:

введите описание изображения здесь

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

1. feature2 не существует в виде столбца в вашем фрейме данных

Ответ №1:

Немного неясно, что именно требуется.

Вот способ использования Seaborn. Сначала преобразуйте фрейм данных в «длинную» форму, затем создайте 20 ячеек для значений и, наконец, создайте диаграммы для каждого объекта:

 from matplotlib import pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns

d = pd.DataFrame({'f1': np.random.rand(100, 100).cumsum(axis=0).ravel(),
                  'f2': np.random.rand(100, 100).cumsum(axis=0).ravel()})
dlong = d.melt(var_name='feature', value_name='value')
dlong['bins'] = pd.cut(dlong['value'], 20)
fig, ax = plt.subplots(figsize=(20, 5))
sns.boxplot(data=dlong, x='bins', y='value', hue='feature', ax=ax)
ax.tick_params(axis='x', rotation=90)
plt.tight_layout()
plt.show()
 

пример графика

Вот способ создания двух подзаголовков с использованием одних и тех же ячеек:

 d = pd.DataFrame({'f1': np.random.rand(100, 100).cumsum(axis=0).ravel(),
                  'f2': np.random.rand(100, 100).cumsum(axis=0).ravel()})
dlong = d.melt(var_name='feature', value_name='value')
dlong['bins'] = pd.cut(dlong['value'], 10)
fig, (ax1, ax2) = plt.subplots(nrows=2, figsize=(12, 10))
sns.boxplot(data=dlong[dlong['feature'] =='f1' ], x='bins', y='value', ax=ax1)
sns.boxplot(data=dlong[dlong['feature'] =='f2' ], x='bins', y='value', ax=ax2)
ax1.set_title('feature = f1')
ax2.set_title('feature = f2')
 

два подзаголовка

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

1. это именно то, что я хочу сделать. Спасибо! Просто мой f1 находится под f2. Как я могу их разделить. Я делаю 10 ячеек. Я тоже поместил изображение.

2. Да, я пробовал это. Но ячейки стали разными для f1 и f2, и поэтому два графика были несопоставимы.

3. Вы можете использовать фиксированные ячейки, например bins=np.arange(min, max, step) , и d['bins_f1'] = pd.cut(d['f1'], bins=bins) . Фиксированные ячейки имеют дополнительное преимущество в том, что края ячеек являются более приятными числами.

4. это именно то, что мне было нужно. Спасибо

5. Я только что сделал. Спасибо 🙂