В pandas, как преобразовать тип нумерации c в тип категории для использования с оттенком морской волны - PullRequest
1 голос
/ 18 февраля 2020

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

test_df = pd.DataFrame({ 'A' : 1.,
                    'B' : np.array([1, 5, 9, 7, 3], dtype='int32'),
                    'C' : np.array([6, 7, 8, 9, 3], dtype='int32'),
                    'D' : np.array([2, 2, 3, 4, 4], dtype='int32'),
                    'E' : pd.Categorical(["test","train","test","train","train"]),
                    'F' : 'foo' })

# fix to category
# test_df['D'] = test_df["D"].astype('category')

# and test plot
f, ax = plt.subplots(figsize=(6,6))
ax = sns.scatterplot(x="B", y="C", hue="D", s=100, 
                     data=test_df)

, который создает этот график:

enter image description here Однако вместо непрерывной шкалы я бы хотел категориальная шкала для каждой из 3 категорий [2, 3, 4]. После того, как я раскомментировал строку кода test_df['D'] = ..., чтобы изменить этот столбец на тип столбца категории для раскраски категории на участке морского побережья, я получаю следующую ошибку с графика морского побережья: TypeError: data type not understood

Кто-нибудь знает правильный способ преобразования этого столбца цифр c в столбец факторов / категорий, чтобы использовать его для раскраски?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Я скопировал / вставил ваш код, добавил библиотеки для импорта и удалил комментарий, так как считал, что он выглядит хорошо. Я получаю график с «категоричной» раскраской для значения [2,3,4] без изменения какого-либо кода.

Попробуйте обновить модуль seaborn, используя: pip install --upgrade seaborn

Вот список рабочих библиотек, используемых с вашим кодом.

matplotlib==3.1.2
numpy==1.18.1
seaborn==0.10.0
pandas==0.25.3

... которые выполняются под кодом .

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

test_df = pd.DataFrame({ 'A' : 1.,
                    'B' : np.array([1, 5, 9, 7, 3], dtype='int32'),
                    'C' : np.array([6, 7, 8, 9, 3], dtype='int32'),
                    'D' : np.array([2, 2, 3, 4, 4], dtype='int32'),
                    'E' : pd.Categorical(["test","train","test","train","train"]),
                    'F' : 'foo' })

# fix to category
test_df['D'] = test_df["D"].astype('category')

# and test plot
f, ax = plt.subplots(figsize=(6,6))
ax = sns.scatterplot(x="B", y="C", hue="D", s=100, 
                     data=test_df)
plt.show()
1 голос
/ 18 февраля 2020

Я допустил ту же ошибку TypeError: data type not understood. Обходной путь, который работает, должен использовать параметр legend="full". Преобразование в категориальный тип в этом подходе не требуется:

ax = sns.scatterplot(x="B", y="C", hue="D", s=100, legend="full", data=test_df)

Другое решение заключается в использовании пользовательской палитры:

ax = sns.scatterplot(x="B", y="C", hue="D", s=100, palette=["b", "g", "r"], data=test_df)

В этом случае количество цветов должно быть равно уникальным значениям в столбец "D".

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