черчение boxplot с sns - PullRequest
       13

черчение boxplot с sns

0 голосов
/ 27 октября 2019

Я хотел бы изобразить значение моих переменных, найденных в наборе данных, в форме коробочного графика. Набор данных следующий:

https://archive.ics.uci.edu/ml/datasets/breast+cancer+wisconsin+(original)

Пока мой код выглядит следующим образом:

import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import preprocessing

df=pd.read_csv(file,names=['id', 'clump_thickness','unif_cell_size',
                                                         'unif_cell_shape', 'marg_adhesion', 'single_epith_cell_size',
                                                         'bare_nuclei', 'bland_chromatin', 'normal_nucleoli','mitoses','Class'])

#boxplot
    plt.figure(figsize=(15,10))
    names=list(df.columns)
    names=names[:-1]

    min_max_scaler=preprocessing.MinMaxScaler()


    X = df.drop(["Class"],axis=1)
    columnsN=list(X.columns) 
    x_scaled=min_max_scaler.fit_transform(X) #normalization
    X[columnsN]=x_scaled 
    y = df['Class']

    sns.set_context('notebook', font_scale=1.5)
    sns.boxplot(x=X['unif_cell_size'],y=y,data=df.iloc[:, :-1],orient="h")

Мой блок-график возвращает следующий рисунок:

enter image description here

но я хотел бы отобразить мою информацию в виде следующего графика:

enter image description here

Я знаю, что это из другого набора данных, но я вижу, что они одновременно отображали диагноз для каждого объекта со своими значениями. Я пытался сделать это по-разному, но я не могу сделать этот график.

Я пробовал следующее:

data_st = pd.concat([y,X],axis=1)
    data_st = pd.melt(data_st,id_vars=columnsN,
                    var_name="X",
                    value_name='value')

    sns.boxplot(x='value', y="X", data=data_st,hue=y,palette='Set1')
    plt.legend(loc='best')

, но до сих пор нет результатов. Любая помощь?

Спасибо

1 Ответ

0 голосов
/ 01 ноября 2019

Измените данные с помощью pandas.DataFrame.melt:

  • Большинство доброкачественных (класс 2) боксплотов имеют значения 0 (масштабированные) или 1 (немасштабированные), так как они должны быть
MinMaxScaler, но в этом случае нет необходимости, поскольку все значения данных очень близки друг к другу. Если вы строите данные без масштабирования, график будет выглядеть так же, за исключением того, что диапазон по оси Y будет 1 - 10 вместо этого.
  • Это действительно должно использоваться только в случаях, когда данные сильно расходятся, когда атрибут будет иметь слишком большое влияние с некоторым алгоритмом ML.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pathlib import Path
import numpy as np
from sklearn.preprocessing import MinMaxScaler

# path to file
p = Path(r'c:\some_path_to_file\breast-cancer-wisconsin.data')

# create dataframe
df = pd.read_csv(p, names=['id', 'clump_thickness','unif_cell_size',
                           'unif_cell_shape', 'marg_adhesion', 'single_epith_cell_size',
                           'bare_nuclei', 'bland_chromatin', 'normal_nucleoli','mitoses','Class'])

# replace ? with np.NaN
df.replace('?', np.NaN, inplace=True)

# scale the data
min_max_scaler = MinMaxScaler()
df_scaled = pd.DataFrame(min_max_scaler.fit_transform(df.iloc[:, 1:-1]))
df_scaled.columns = df.columns[1:-1]
df_scaled['Class'] = df['Class']

# melt the dataframe
df_scaled_melted = df_scaled.iloc[:, 1:].melt(id_vars='Class', var_name='Attributes', value_name='Values')

# plot the data
plt.figure(figsize=(12, 8))
g = sns.boxplot(x='Attributes', y='Values', hue='Class', data=df_scaled_melted)
for item in g.get_xticklabels():
    item.set_rotation(90)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()

enter image description here

без масштабирования:

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

p = Path.cwd() / r'data\breast_cancer\breast-cancer-wisconsin.data'

df = pd.read_csv(p, names=['id', 'clump_thickness','unif_cell_size',
                           'unif_cell_shape', 'marg_adhesion', 'single_epith_cell_size',
                           'bare_nuclei', 'bland_chromatin', 'normal_nucleoli','mitoses','Class'])

df.replace('?', np.NaN, inplace=True)
df.dropna(inplace=True)
df = df.astype('int')

df_melted = df.iloc[:, 1:].melt(id_vars='Class', var_name='Attributes', value_name='Values')

plt.figure(figsize=(12, 8))
g = sns.boxplot(x='Attributes', y='Values', hue='Class', data=df_melted)
for item in g.get_xticklabels():
    item.set_rotation(90)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...