Я пытаюсь раскрасить диаграмму рассеяния по категориальному столбцу. Вот пример данных, столбец, по которому я хочу раскрасить диаграмму рассеяния, — «кошка».
data = {
'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'y': [2, 3, 5, 7, 11, 13, 17, 19, 23, 29],
'z': [1, 2, 2, 3, 3, 4, 4, 5, 6, 6],
'cat': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'A', 'A']
}
pandas_df = pd.DataFrame(data)
pyspark_df = spark.createDataFrame(pandas_df)
Я создал следующую функцию для проверки вывода. Если я удалю «оттенок» из параметров, все будет работать нормально, но я не могу заставить его работать правильно с «оттенком».
def facet_plot(df, x, y, color, facet_col, bins = None):
pd_df = df.toPandas()
if bins is not None:
# check col type
if pd_df[facet_col].dtype.name in ['float64', 'int64']:
# bin the facet column
pd_df['facet_col_binned']= pd.cut(pd_df[facet_col], bins = bins)
# convert intervals to midpoints
pd_df['facet_col_binned'] = pd_df['facet_col_binned'].apply(lambda interval: round(interval.mid, 1) if pd.notna(interval) else None)
pd_df['facet_col_binned'] = pd.Categorical(pd_df['facet_col_binned'])
# assigning x as 'x_binned' for remaining code
facet_col = 'facet_col_binned'
pd_df[color] = pd_df[color].astype(str)
g = sns.FacetGrid(pd_df, col=facet_col, col_wrap=4, height=5, aspect=2)
g.map(sns.scatterplot, x, y, hue=color)
# if row => then change to row_template = '{row_name}'
g.set_titles(col_template = '{col_name}')
g.set_axis_labels(x, y)
plt.show()
facet_plot(pyspark_df, 'x', 'y', color = 'cat', facet_col='cat', bins = 2)






Во-первых, создание более минимального примера помогает точно определить проблему:
import seaborn as sns
import pandas as pd
data = {
'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'y': [2, 3, 5, 7, 11, 13, 17, 19, 23, 29],
'z': [1, 2, 2, 3, 3, 1, 1, 2, 3, 3],
'cat': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'A', 'A']
}
pd_df = pd.DataFrame(data)
g = sns.FacetGrid(pd_df, col='z', col_wrap=3, height=3, aspect=2)
g.map(sns.scatterplot, 'x', 'y', hue='cat')
Основная проблема заключается в том, что g.map не предоставляет полный фрейм данных при вызове sns.scatterplot. Он только заменяет 'x' и 'y' соответствующими столбцами кадра данных. Таким образом, g.map() не может разрешить («интерпретировать») столбец 'cat'.
Один из вариантов — вместо этого использовать g.map_dataframe. Поскольку легенда фигуры не создается автоматически, вам также нужно будет вызвать g.add_legend().
Лучшее решение — добавить hue= к sns.FacetGrid(...., hue='cat') и оставить его в g.map(sns.scatterplot, 'x', 'y').
Рекомендуемое решение — использовать «уровень фигуры» версию вашей функции. Для sns.scatterplot это sns.relplot. Это также создает FacetGrid, но более точно настроено для диаграммы рассеяния.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
data = {
'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'y': [2, 3, 5, 7, 11, 13, 17, 19, 23, 29],
'z': [1, 2, 2, 3, 3, 1, 1, 2, 3, 3],
'cat': ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B', 'A', 'A']
}
pd_df = pd.DataFrame(data)
g = sns.relplot(pd_df, x='x', y='y', hue='cat', col='z', col_wrap=3, height=3, aspect=2)
plt.show()
Не могли бы вы указать нам, где в вашем коде находится параметр оттенка? Ваша функция
facet_plot, похоже, не меняет оттенок параметра оттенка