我有两个具有不同长度和变量数量的系列,并且想要绘制每个系列每个变量(名称)的出现频率。 我想要系列1的灰色计数图和系列2的红色计数图,我希望它们能够在彼此的顶部显示。 但是,由于缺少系列2,南希'它也在削减Nancy'系列1系列。 如何获得两个系列的完整叠加,为南希留下一个栏?
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()
编辑: 更改为以下内容将再次导致问题。如何让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()
答案 0 :(得分:4)
您可以存储第一个绘图的设置,并在绘制第二个绘图后恢复它们。
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()
另一个选项可能是首先绘制第二个绘图,但将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()