【问题标题】:How To Plot Multiple Histograms On Same Plot With Seaborn如何使用 Seaborn 在同一图上绘制多个直方图
【发布时间】:2016-07-21 15:09:50
【问题描述】:

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

这会产生以下情节。

但是,当我尝试对 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 实现这种风格的直方图?

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    如果我理解正确,你可能想试试这个:

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

    应该产生这样的情节:

    更新

    看起来您想要“seaborn 外观”而不是 seaborn 绘图功能。 为此,您只需:

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

    这将产生:

    【讨论】:

    • 这看起来像一个叠加层,但有没有办法让条形图并排而不是叠加?
    • 如何根据分布(在您的示例中为 x 和 y)在 seaborn 中创建直方图,这些分布太大而无法保存在内存中?
    • @ThomasMatthew 这是一个很好的问题,但最好作为一个单独的问题来解决(即您需要提出“一个新问题”)。
    • 模块 'seaborn' 没有属性 'plot'。
    【解决方案2】:

    将 x 和 y 合并到 DataFrame,然后使用 histplot 和 multiple='dodge' 和 hue 选项:

    import random
    
    import matplotlib.pyplot as plt
    import pandas as pd
    import seaborn as sns
    
    x = [random.randrange(100) for _ in range(100)]
    y = [random.randrange(100) for _ 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])
    

    【讨论】:

    • 为什么是for _ in range() 而不是for i in range()?见stackoverflow.com/a/5893946/3364859
    • @henry-ecker 为什么要重新排序导入的包?
    • _ 因为在理解中没有使用i。我们在调用函数 random.randrange(100) 时没有使用 range 函数生成的值,这就是丢弃变量更合适的原因(表示我们使用变量 i )。包裹被重新订购以满足PEP8 import guidelines。 “导入应按以下顺序分组:(1)标准库导入。(2)相关第三方导入......您应该在每组导入之间放置一个空行。” @marianoju
    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 2020-10-21
    • 2015-01-10
    相关资源
    最近更新 更多