如何用Seaborn在同一个地块上绘制多个直方图

时间:2016-04-01 17:43:45

标签: python matplotlib seaborn

使用matplotlib,我可以在一个图上创建一个包含两个数据集的直方图(一个与另一个相邻,不是叠加)。

import matplotlib.pyplot as plt
import random

x = [random.randrange(100) for i in range(100)]
y = [random.randrange(100) for i in range(100)]
plt.hist([x, y])
plt.show()

这产生以下图。

enter image description here

然而,当我尝试用seabron做这件事时;

import seaborn as sns
sns.distplot([x, y])

我收到以下错误:

ValueError: color kwarg must have one color per dataset

然后我尝试添加一些颜色值:

sns.distplot([x, y], color=['r', 'b'])

我得到同样的错误。我看到this post关于如何叠加图形,但我希望这些直方图是并排的,而不是叠加的。

查看docs它并没有指定如何将列表列表作为第一个参数' a'。

如何使用seaborn实现这种直方图?

2 个答案:

答案 0 :(得分:28)

如果我理解正确你可能想尝试一下这个:

fig, ax = plt.subplots()
for a in [x, y]:
    sns.distplot(a, bins=range(1, 110, 10), ax=ax, kde=False)
ax.set_xlim([0, 100])

哪个应该产生这样的情节:

enter image description here

<强>更新

看起来你想要&#39; seaborn look&#39;而不是seaborn绘图功能。 为此,您只需要:

import seaborn as sns
plt.hist([x, y], color=['r','b'], alpha=0.5)

将产生:

enter image description here

答案 1 :(得分:2)

将 x 和 y 合并到 DataFrame,然后使用带有 multiple='dodge' 和色调选项的 histplot:

import matplotlib.pyplot as plt
import pandas as pd
import random

x = [random.randrange(100) for i in range(100)]
y = [random.randrange(100) for i in range(100)]
df = pd.concat(axis=0, ignore_index=True, objs=[
    pd.DataFrame.from_dict({'value': x, 'name': 'x'}),
    pd.DataFrame.from_dict({'value': y, 'name': 'y'})
])
fig, ax = plt.subplots()
sns.histplot(data=df, x='value', hue='name', multiple='dodge', bins=range(1, 110, 10), ax=ax)
ax.set_xlim([0, 100])

Here is the plot result.