使用seaborn.objects绘制水平条

问题描述 投票:0回答:2

在原始 API 中,

barplot
提供了
orient
参数来交换栏方向:

import pandas as pd, numpy as np, seaborn as sns

df = pd.DataFrame(data=np.random.randint(10, size=(3, 5)), columns=[*"abcde"])
#    a  b  c  d  e
# 0  8  6  5  2  3
# 1  0  0  0  1  8
# 2  6  9  5  6  9

sns.barplot(data=df, orient="h") 

objects
API 中,似乎我们现在应该
add
标记层的方向,但我不确定如何:

import seaborn.objects as so

so.Plot(data=df).add(so.Bar(), so.Agg(), orient="h")
# ValueError: No grouping variables are present in dataframe

使用新的

objects
API 更改栏方向的惯用方法是什么?

python seaborn bar-chart seaborn-objects
2个回答
3
投票

您可以使用对象界面绘制水平条,并且

add
确实有一个
orient
参数(尽管它接受
x
/
y
而不是
v
/
h
,因为前者可以更好地概括所有类型的标记)。

但是目前这里不支持绘制“宽格式”数据。

宽格式数据的问题在于,不同类型的图会以不同的方式使用数据集的维度。使用函数接口,每种函数类型都可以指定映射(例如,

barplot
将列映射到
x
(或水平条的
y
),而
lineplot
将索引映射到
x

我不知道对象接口是否会在某个时候支持这一点,但目前不支持。您需要将数据帧转换为长格式并显式分配 x/y。


1
投票

为了完整起见,复制宽格式数据的原始水平

barplot
行为:

# old interface
sns.barplot(data=df, orient="h")

我们现在需要将

melt
转换为长格式并显式交换
x
/
y
:

# new interface
so.Plot(
    data=df.melt(), # convert to long-form
    x="value",      # set x as numeric
    y="variable",   # set y as categorical
).add(
    so.Bar(),
    so.Agg(),
)

© www.soinside.com 2019 - 2024. All rights reserved.