gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:47:26 24 4
gpt4 key购买 nike

我有两个具有不同长度和变量数量的系列,我想绘制每个系列中每个变量(名称)出现的频率。我想要系列 1 的灰色计数图和系列 2 的红色计数图,我希望它们显示在彼此之上。然而,由于第 2 季缺少“Nancy”,它也削减了第 1 季中“Nancy”的数量。我如何获得两个系列的完整叠加,包括 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()

enter image description here

编辑:改成下面的又会出问题。我如何让 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()

最佳答案

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

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()

enter image description here

另一种选择是先绘制第二个图,但将 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()

在更一般的情况下,您需要使用 order 参数。

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()

如果您更愿意使用 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()

关于python - 在一个图中具有不同类别的 Matplotlib/Seaborn Countplot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49203408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com