在 seaborn 箱线图中隐藏未观察到的类别
Hide non observed categories in a seaborn boxplot
我目前在做数据分析,想通过seaborn箱线图展示一些数据分布。
我有一个分类数据 'seg1',它在我的数据集中可以取 3 个值('Z1'、'Z3'、'Z4')。但是,组 'Z4' 中的数据太奇特了,无法为我报告,我想制作仅显示类别 'Z1' 和 'Z3'.
的箱线图
过滤绘图的数据源无效,因为类别 'Z4' 仍然显示没有数据点。
除了必须创建一个新的 CategoricalDtype
之外,还有其他解决方案吗?只有 ('Z1'、'Z3') 和 cast/project 我的数据返回到这个新类别?
我只想隐藏 'Z4' 类别。
我正在使用 seaborn 0.10.1 和 matplotlib 3.3.1。
提前感谢您的回答。
下面是我的尝试,还有一些数据要重现。
虚拟数据
dummy_cat = pd.CategoricalDtype(['a', 'b', 'c'])
df = pd.DataFrame({'col1': ['a', 'b', 'a', 'b'], 'col2': [12., 5., 3., 2]})
df.col1 = df.col1.astype(dummy_cat)
sns.boxplot(data=df, x='col1', y='col2')
不应用过滤器
fig, axs = plt.subplots(figsize=(8, 25), nrows=len(indicators2), squeeze=False)
for j, indicator in enumerate(indicators2):
sns.boxplot(data=orders, y=indicator, x='seg1', hue='origin2', ax=axs[j, 0], showfliers=False)
产生:
过滤数据源
mask_filter = orders.seg1.isin(['Z1', 'Z3'])
fig, axs = plt.subplots(figsize=(8, 25), nrows=len(indicators2), squeeze=False)
for j, indicator in enumerate(indicators2):
sns.boxplot(data=orders.loc[mask_filter], y=indicator, x='seg1', hue='origin2', ax=axs[j, 0], showfliers=False)
产生:
要截掉最后一个(或第一个)x-value,可以使用set_xlim()
,例如ax.set_xlim(-0.5, 1.5)
.
另一种选择是使用 seaborn 的 order=
参数,并只在该列表中添加所需的值。可以选择以编程方式创建:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
dummy_cat = pd.CategoricalDtype(['a', 'b', 'c'])
df = pd.DataFrame({'col1': ['a', 'b', 'a', 'b'], 'col2': [12., 5., 3., 2]})
df.col1 = df.col1.astype(dummy_cat)
order = [cat for cat in dummy_cat.categories if df['col1'].str.contains(cat).any()]
sns.boxplot(data=df, x='col1', y='col2', order=order)
plt.show()
我目前在做数据分析,想通过seaborn箱线图展示一些数据分布。
我有一个分类数据 'seg1',它在我的数据集中可以取 3 个值('Z1'、'Z3'、'Z4')。但是,组 'Z4' 中的数据太奇特了,无法为我报告,我想制作仅显示类别 'Z1' 和 'Z3'.
的箱线图过滤绘图的数据源无效,因为类别 'Z4' 仍然显示没有数据点。
除了必须创建一个新的 CategoricalDtype
之外,还有其他解决方案吗?只有 ('Z1'、'Z3') 和 cast/project 我的数据返回到这个新类别?
我只想隐藏 'Z4' 类别。
我正在使用 seaborn 0.10.1 和 matplotlib 3.3.1。
提前感谢您的回答。
下面是我的尝试,还有一些数据要重现。
虚拟数据
dummy_cat = pd.CategoricalDtype(['a', 'b', 'c'])
df = pd.DataFrame({'col1': ['a', 'b', 'a', 'b'], 'col2': [12., 5., 3., 2]})
df.col1 = df.col1.astype(dummy_cat)
sns.boxplot(data=df, x='col1', y='col2')
不应用过滤器
fig, axs = plt.subplots(figsize=(8, 25), nrows=len(indicators2), squeeze=False)
for j, indicator in enumerate(indicators2):
sns.boxplot(data=orders, y=indicator, x='seg1', hue='origin2', ax=axs[j, 0], showfliers=False)
产生:
过滤数据源
mask_filter = orders.seg1.isin(['Z1', 'Z3'])
fig, axs = plt.subplots(figsize=(8, 25), nrows=len(indicators2), squeeze=False)
for j, indicator in enumerate(indicators2):
sns.boxplot(data=orders.loc[mask_filter], y=indicator, x='seg1', hue='origin2', ax=axs[j, 0], showfliers=False)
产生:
要截掉最后一个(或第一个)x-value,可以使用set_xlim()
,例如ax.set_xlim(-0.5, 1.5)
.
另一种选择是使用 seaborn 的 order=
参数,并只在该列表中添加所需的值。可以选择以编程方式创建:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
dummy_cat = pd.CategoricalDtype(['a', 'b', 'c'])
df = pd.DataFrame({'col1': ['a', 'b', 'a', 'b'], 'col2': [12., 5., 3., 2]})
df.col1 = df.col1.astype(dummy_cat)
order = [cat for cat in dummy_cat.categories if df['col1'].str.contains(cat).any()]
sns.boxplot(data=df, x='col1', y='col2', order=order)
plt.show()