seaborn.boxplot для каждой переменной набора данных - PullRequest
0 голосов
/ 27 мая 2018

Я работаю с набором данных Висконсин .Чтобы отобразить блок-график, где ось Y является переменной кадра данных (например, radius_mean), а ось X является диагнозом, я делаю следующее:

sns.boxplot(x='label', y='radius', data=dsWisconsin)

(dsWisconsin - это кадр данных, загруженный пандамииз .csv)

Мой вопрос, вместо того, чтобы делать предыдущий кусок кода для каждой переменной, как я могу отобразить все коробочные графики каждой переменной (в сетке)?

ДляНапример, что-то вроде этого, но с полем для каждой переменной из Висконсина:

Multiple histogram

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы можете преобразовать данные в формат Tidy и использовать FacetGrid

df = df.melt(id_vars=['id', 'diagnosis'])
df[:3]
#          id diagnosis     variable  value
# 0    842302         M  radius_mean  17.99
# 1    842517         M  radius_mean  20.57
# 2  84300903         M  radius_mean  19.69

cols = ['radius_mean', 'texture_mean', 'perimeter_mean', 'area_mean']
grid = sns.axisgrid.FacetGrid(df[df.variable.isin(cols)], col='variable', sharey=False)
grid.map(sns.boxplot, 'diagnosis','value')

enter image description here

0 голосов
/ 27 мая 2018

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

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

df = pd.read_csv('C:\wisconsin.csv', index_col=0)

n_rows = 5
n_cols = 6
count = 0
col_num = 1

plt.subplots(n_rows, n_cols)
for i in range(n_rows):
    for j in range(n_cols):
        plt.subplot(n_rows, n_cols, count+1)
        sns.boxplot(df.iloc[:, col_num], orient='vertical')
        if col_num < df.shape[1] :
            count += 1
            col_num += 1

plt.show()

enter image description here

df_1 = df.iloc[:, 1:-1]

n_rows = 5
col_start = 0
delta = 7
col_end = 0


for i in range(n_rows):
    col_end = col_start + delta
    df.iloc[:, col_start:col_end].plot(kind = 'box', subplots=True, sym='b.')
    col_start += delta

plt.show()

enter image description here

...