Matplotlib / Seaborn Countplot 在一个图中具有不同的类别

Rol*_*olo 2 python matplotlib seaborn

我有两个具有不同长度和变量数量的系列,并且想要绘制每个系列中每个变量(名称)出现的频率。我想要系列 1 的灰色计数图和系列 2 的红色计数图,我希望它们彼此重叠显示。然而,由于系列 2 缺少“南希”,它也减少了系列 1 的“南希”计数。我如何获得包含 Nancy 酒吧的两个系列的完整叠加?

import matplotlib.pyplot as plt
import seaborn as sns

ser1 = pd.Series( ['tom','tom','bob','bob','nancy'])
ser2 = pd.Series( ['tom','bob'])

fig = plt.figure()
sns.countplot(x=ser1, color='grey')
sns.countplot(x=ser2, color='red')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

编辑:更改为以下将再次导致问题。我如何让 Matplotlib 识别出这两个系列具有相同的正在计算的分类值?

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

ser1 = pd.Series( ['tom','tom','bob','bob','nancy','zulu'])
ser2 = pd.Series( ['tom','nancy'])

ser1 = ser1.astype('category')
ser2 = ser2.astype('category')

fig = plt.figure()
ax = sns.countplot(x=ser2, color='red', zorder=2)
sns.countplot(x=ser1, color='grey')

plt.show()
Run Code Online (Sandbox Code Playgroud)

Imp*_*est 5

您可以存储第一个图的设置并在绘制第二个图后恢复它们。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

ser1 = pd.Series( ['tom','tom','bob','bob','nancy','zulu'])
ser2 = pd.Series( ['tom','bob'])

fig = plt.figure()
ax = sns.countplot(x=ser1, color='grey')
ticks = ax.get_xticks()
ticklabels = ax.get_xticklabels()
lim = ax.get_xlim()

sns.countplot(x=ser2, color='red')
ax.set_xlim(lim)
ax.set_xticks(ticks)
ax.set_xticklabels(ticklabels)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

另一种选择可能是先绘制第二个图,但将 zorder 设置为更高的值,以便这些条形出现在后面的图之前。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

ser1 = pd.Series( ['tom','tom','bob','bob','nancy','zulu'])
ser2 = pd.Series( ['tom','bob'])

fig = plt.figure()
ax = sns.countplot(x=ser2, color='red', zorder=2)
sns.countplot(x=ser1, color='grey')

plt.show()
Run Code Online (Sandbox Code Playgroud)

在更一般的情况下,您需要使用orderarument。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

ser1 = pd.Series( ['tom','tom','bob','bob','nancy', 'nancy' ,'zulu'])
ser2 = pd.Series( ['tom','nancy'])
order = ser1.append(ser2).unique()

fig = plt.figure()
ax = sns.countplot(x=ser2, color='red', order=order, zorder=2)
sns.countplot(x=ser1, color='grey', order=order)

plt.show()
Run Code Online (Sandbox Code Playgroud)

如果您更愿意使用 matplotlib 的分类来创建绘图,则如下所示:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

ser1 = pd.Series( ['tom','tom','bob','bob','nancy', 'nancy' ,'zulu'])
ser2 = pd.Series( ['tom','nancy'])

u1, counts1 = np.unique(ser1.values, return_counts=True)
u2, counts2 = np.unique(ser2.values, return_counts=True)

fig, ax = plt.subplots()
ax.bar(u1,counts1, color='grey')
ax.bar(u2,counts2, color='red')

plt.show()
Run Code Online (Sandbox Code Playgroud)