python - 如何使用 seaborn 为每个数据列设置绘图样式来绘制分类数据?
问题描述
背景
假设我有以下数据集:
import pandas as pd
import numpy as np
data = ([["Cheese", x] for x in np.random.normal(0.8, 0.03, 10)] +
[["Meat", x] for x in np.random.normal(0.4, 0.05, 14)] +
[["Bread", 0.8], ["Bread", 0.65]])
df = pd.DataFrame(data, columns=["Food", "Score"])
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="ticks", color_codes=True)
sns.set_context("paper")
sns.catplot(x="Score", y="Food", kind="box", data=df)
这会产生以下图(或类似图,取决于生成的随机数):
我要用我的实际数据绘制箱线图的原因是,单个点与我想要显示的类别数量相结合,使图表在视觉上过于嘈杂,并且这些方框很好地概述了数据的分布方式,即我追求的是什么。但是,问题在于“面包”类别等类别。
问题
如您所见,seaborn 为所有三个类别制作了带有中位数、四分位数等的盒子。但是,由于“面包”类别只有两个数据点,因此使用箱线图表示该类别并不是真正合适的表示。我宁愿将这个类别仅作为单个点。
但是在查看https://seaborn.pydata.org/tutorial/categorical.html上的示例时,组合箱线图和简单点的唯一建议是为所有类别都绘制这不是我所追求的。
简而言之:如何使用 seaborn 绘制分类数据,为每个类别选择适当的表示?
解决方案
也许尝试为面包而不是面包创建 df :
dfb = df[df['Food'].notnull() & (df['Food'] == 'Bread')]
dfnot_b = df[df['Food'].notnull() & (df['Food'] != 'Bread')]
然后添加另一个轴:
fig, ax = plt.subplots()
ax2 = ax.twinx()
尝试不同的情节:
sns.boxplot(x="Score", y="Food", data=dfnot_b, ax=ax)
sns.stripplot(x="Score", y="Food", data=dfb, ax=ax2)
推荐阅读
- javascript - React JS 组件未应用 CSS 边距
- rest - Apache Camel:使用 toD() 的 GET 服务调用导致无限循环
- angular - Angular - 使用 ASP.NET Core Web API 从相关表中检索数据
- c++ - 使用谷歌风格命名约定在 vscode 中 lint c++
- javascript - 使用 npm 在引导程序中进行 Web 开发时遇到错误
- java - 是否可以使用 Azure Functions 托管 ID 操作 VM?
- sanity - 解决 Sanity.io 中块内容中的引用
- python - Python 面向对象编程中关键字“self”的用途是什么?
- php - 如何在 Mongodb 的一个管道中合并 $match 和 $geoNear 的结果
- android - 将 jobject 转换为 jstring 时崩溃 - Android Studio、Android API 28、Pixel 4XL 模拟器,仅在调试时