【问题标题】:Pandas: Stacked dots histogramPandas:堆积点直方图
【发布时间】:2018-05-03 14:42:17
【问题描述】:

基本上,标题。我想做一个直方图,将条形图替换为堆积点的列。这个特定问题有一个答案in R,但我想留在 python 中。

非常感谢任何帮助:)

编辑:添加图片链接 example of what the final result should look like

【问题讨论】:

    标签: python pandas histogram


    【解决方案1】:

    在 matplotlib 或其衍生物(我很熟悉)中没有任何开箱即用的东西可以做到这一点。幸运的是,pandas.Series.value_counts() 为我们做了很多繁重的工作:

    import numpy
    from matplotlib import pyplot
    import pandas
    
    numpy.random.seed(0)
    pets = ['cat', 'dog', 'bird', 'lizard', 'hampster']
    hist = pandas.Series(numpy.random.choice(pets, size=25)).value_counts()
    x = []
    y = []
    for p in pets:
        x.extend([p] * hist[p])
        y.extend(numpy.arange(hist[p]) + 1)
    
    fig, ax = pyplot.subplots(figsize=(6, 6))
    ax.scatter(x, y)
    ax.set(aspect='equal', xlabel='Pet', ylabel='Count')
    

    这给了我:

    【讨论】:

    • 是的!这正是我想要的。太糟糕了,没有更简单的方法。谢谢!
    【解决方案2】:

    不确定您所说的“带点的直方图”是什么意思,但您所描述的内容让我想起 seaborn's swarmplot:

    sns.swarmplot(x="day", y="total_bill", data=tips);
    

    此处的 Swarmplot 文档:https://seaborn.pydata.org/generated/seaborn.swarmplot.html

    看到您的编辑后,似乎这可能是您正在寻找的更多内容:

    import matplotlib.pyplot as plt
    import numpy as np
    from collections import Counter
    
    data = np.random.randint(10, size=100)
    c = Counter(data)
    d = dict(c)
    l = []
    
    for i in data:
        l.append(d[i])
        d[i] -= 1
    
    plt.scatter(data, l)
    plt.show()
    

    我个人认为 swarmplot 看起来好多了,但不管你的船是什么。

    【讨论】:

    • 我恐怕不是这个意思。我想要的是一个直方图,其中条形图被点条代替,因此高度为 3 的条形图实际上显示了一堆 3 个点。我已经编辑并添加了一张图片。
    • @jasikevicius23 据我所知,这不是matplotlib.pyplotpandas 的功能。这也许可以通过从直方图中获取数据并将其重塑为散点图来完成。这行得通吗?
    猜你喜欢
    • 1970-01-01
    • 2017-07-08
    • 2011-01-15
    • 2018-10-25
    • 1970-01-01
    • 2021-12-01
    • 2016-05-24
    • 2018-05-09
    相关资源
    最近更新 更多