#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. Я только что сделал. Спасибо 🙂