Использование ключевого аргумента 'bottom' в барботере Seaborn - PullRequest
0 голосов
/ 28 марта 2020

У меня есть pandas фрейм данных, содержащий 2 категориальных столбца и 2 столбца значений. Я хочу иметь возможность использовать аргумент «bottom» при использовании функции barplot в Seaborn, но я получаю ValueError и ConversionError, потому что он не обрабатывает «Min Value» так же, как аргументы x, y и hue.

Желаемым выходом для этого будет сгруппированная полоса, показывающая плавающую полосу с минимальными и максимальными значениями для указанной группировки.

Ниже показан пример нерабочего кода и мой желаемый вывод.

import seaborn as sns
import pandas as pd

df = pd.DataFrame.from_dict({"Category 1": ["A","A","A","B","B","B"],
                   "Category 2": ["Bad","Good","Good","Bad","Good","Good"],
                   "Min Value": [2,5,3,4,1,0],
                   "Max Value": [10,5,8,5,11,4]})

sns.barplot(x = "Category 1", y = "Max Value", hue="Category 2", data = df,
            estimator = max,
            ci = 0,
            bottom = "Min Value")

Желаемый вывод image

Обновление Модификация принятого решения, чтобы сделать его более лаконичным.

# Group by the categories
df = df.groupby(["Category 1", "Category 2"])
# Columnwise aggregation
df = df.agg({"Min Value": min,"Max Value": max})
# Plot
sns.boxplot(data=df.T)

1 Ответ

0 голосов
/ 28 марта 2020

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

# Construct the DataFrame with MultiIndex:
df = pd.DataFrame.from_dict({"Min Value": [2,5,3,4,1,0],
                             "Max Value": [10,5,8,5,11,4]})
index_arr = [["A","A","A","B","B","B"],
             ["Bad","Good","Good","Bad","Good","Good"]]
df.index = pd.MultiIndex.from_arrays(index_arr, 
                                     names=["Category 1", "Category 2"])

# Use groupby to find min and max for each category
df_max = df.groupby(by=['Category 1', 'Category 2']).max()
df_min = df.groupby(by=['Category 1', 'Category 2']).min()

# Set the min values for the first column
df_max.iloc[:,0] = df_min.iloc[:,0]

# Plot the Boxplot (seems more appropriate then barplot)
sns.boxplot(data=df_max.T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...