matplotlib - 将一个没有数据的类别添加到 seaborn 的绘图中
问题描述
我正在将一些数据绘制为这样的 catplot:
ax = sns.catplot(x='Kind', y='VAF', hue='Sample', jitter=True, data=df, legend=False)
麻烦的是某些类别不'VAF'
包含数据,并且相应的标签没有添加到图中。有没有办法保留标签但不为它绘制任何点?
这是一个可重复的示例来帮助解释:
x=pd.DataFrame({'Data':[1,3,4,6,3,2],'Number':['One','One','One','One','Three','Three']})
plt.figure()
ax = sns.catplot(x='Number', y='Data', jitter=True, data=x)
在此图中,您可以看到在 x 轴上显示了样本一和三。但是想象一下,还有一个样本 2,其中没有数据点。如何在 x 轴上显示一、二和三?
解决方案
订单参数
当然,需要知道哪些类别是预期的。给定预期类别的列表,可以使用order
参数来提供预期类别。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame({'Data':[1,3,4,6,3,2],
'Number':['One','One','One','One','Three','Three']})
exp_cats = ["One", "Two", "Three"]
ax = sns.stripplot(x='Number', y='Data', jitter=True, data=df, order=exp_cats)
plt.show()
备择方案
以上适用于 matplotlib 2.2.3,但不适用于 3.0。它再次适用于当前的开发版本(因此为 3.1)。目前,有以下替代方案:
A. 循环分类
给定一个预期类别的列表,你可以遍历它们并绘制每个类别的散点图。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'Data':[1,3,4,6,3,2],
'Number':['One','One','One','One','Three','Three']})
exp_cats = ["One", "Two", "Three"]
for i, cat in enumerate(exp_cats):
cdf = df[df["Number"] == cat]
x = np.zeros(len(cdf))+i+.2*(np.random.rand(len(cdf))-0.5)
plt.scatter(x, cdf["Data"].values)
plt.xticks(range(len(exp_cats)), exp_cats)
plt.show()
B. 将类别映射到数字。
您可以将预期类别映射到数字并绘制数字而不是类别。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'Data':[1,3,4,6,3,2],
'Number':['One','One','One','One','Three','Three']})
exp_cats = ["One", "Two", "Three"]
df["IntNumber"] = df["Number"].map(dict(zip(exp_cats, range(len(exp_cats)))))
plt.scatter(df["IntNumber"] + .2*(np.random.rand(len(df))-0.5), df["Data"].values,
c = df["IntNumber"].values.astype(int))
plt.xticks(range(len(exp_cats)), exp_cats)
plt.show()
C. 将缺失的类别附加到数据框中
最后,您可以将值附加nan
到数据框中,以确保每个预期的类别都出现在其中。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.DataFrame({'Data':[1,3,4,6,3,2],
'Number':['One','One','One','One','Three','Three']})
exp_cats = ["One", "Two", "Three"]
dfa = df.append(pd.DataFrame({'Data':[np.nan]*len(exp_cats), 'Number':exp_cats}))
ax = sns.stripplot(x='Number', y='Data', jitter=True, data=dfa, order=exp_cats)
plt.show()
推荐阅读
- go - 如果项目存在于使用 Golang 和 bson 的数组中,则过滤 mongo 集合
- django - 在 Django 中重新创建应用迁移
- node.js - macOS 11.1 Big Sur 上的 Puppeteer 和 Headless Chrome Crawler
- python - 如何使用 openvino 的 opencv 从 UDP 捕获视频
- java - 正则表达式验证无法停止无效数据
- r - 绘制理论逆卡方分布
- javascript - AWS CDK StringListParameter allowedPattern 问题
- android - 使用 react native 和 expo 时的闪屏模糊
- c# - 在 Azure AD B2C 中请求令牌时缺少范围“scp”
- c - 我是否正确理解了代码中指针的使用?