【问题标题】:Python - Categorical bubble plotPython - 分类气泡图
【发布时间】:2018-05-17 20:11:00
【问题描述】:

我有一个 12x17 的数据框,并想创建一个如下所示的分类气泡图:

https://i.stack.imgur.com/IvD58.png(来自Categorical bubble plot for mapping studies

我的数据框基本上是这样的:

#      A     B     C
# X   0.3   0.2   0.4
# Y   0.1   0.4   0.1

我不能使用 matplotlib.scatter,因为它不接受分类输入,并且创建假值也不起作用,因为它不是 n*n。或者我可以吗?我想不通。我发现 seaborn.stripplot 需要一个分类输入,但所有气泡的大小都是相同的,所以我被卡住了。

有什么想法可以在 python 中创建这样的情节吗?非常感谢。

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    我认为scatter 图非常适合创建这种分类气泡图。

    创建数据框:

    import pandas as pd
    df = pd.DataFrame([[.3,.2,.4],[.1,.4,.1]], columns=list("ABC"), index=list("XY"))
    

    选项 1:取消堆叠 DataFrame

    dfu = df.unstack().reset_index()
    dfu.columns = list("XYS")
    

    这会创建一个类似的表

       X  Y    S
    0  A  X  0.3
    1  A  Y  0.1
    2  B  X  0.2
    3  B  Y  0.4
    4  C  X  0.4
    5  C  Y  0.1
    

    您可以按列绘制。由于散点的大小是点,因此需要将S 列乘以一些较大的数字,例如 5000 以获得大气泡。

    import matplotlib.pyplot as plt
    dfu["S"] *= 5000
    plt.scatter(x="X", y="Y", s="S", data=dfu)
    plt.margins(.4)
    plt.show()
    

    选项 2:创建网格

    使用例如numpy,可以创建数据框列和索引的网格,然后可以绘制扁平网格的散点图。再次需要将数据帧值乘以某个大数。

    import numpy as np
    import matplotlib.pyplot as plt
    
    x,y = np.meshgrid(df.columns, df.index)
    
    df *= 5000
    plt.scatter(x=x.flatten(), y=y.flatten(), s=df.values.flatten())
    plt.margins(.4)
    plt.show()
    

    在这两种情况下,结果都是这样的

    【讨论】:

    • 非常感谢您的帮助!这让它变得容易多了!
    • 试过了,但它会抛出以下错误:ValueError: could not convert string to float: 'Y'
    • @p0712 您可能使用的是旧版本的 matplotlib,需要至少更新到 matplotlib 2.1 才能正常工作。
    猜你喜欢
    • 2021-05-23
    • 2018-12-18
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多