【问题标题】:Multi Index Seaborn Line Plot多指数 Seaborn 线图
【发布时间】:2021-07-18 16:10:43
【问题描述】:

我有一个多索引数据框,其中两个索引是 Sample 和 Lithology

 Sample        20EC-P     20EC-8  20EC-10-1  ...     20EC-43    20EC-45    20EC-54
Lithology         Pd     Di-Grd         Gb  ... Hbl Plag Pd     Di-Grd         Gb
Rb          7.401575  39.055118   6.456693  ...    0.629921  56.535433  11.653543
Ba         24.610102  43.067678  10.716841  ...    1.073115  58.520532  56.946630
Th          3.176471  19.647059   3.647059  ...    0.823529  29.647059   5.294118

我正在尝试将其放入 seaborn 线图中。

spider = sns.lineplot(data = data, hue = data.columns.get_level_values("Lithology"),
                      style = data.columns.get_level_values("Sample"),
                      dashes = False, palette = "deep")

线图显示为

1

我有两个问题。首先,我想通过岩性和样品来格式化色调。在 lineplot 函数之外,我可以使用data.columns.get_level_values 成功访问样品和岩性,但在 lineplot 中它们似乎没有做任何事情,我还没有找到另一种访问这些值的方法。此外,线图按字母顺序重新组织 x 轴。我想强制它保持与数据框相同的顺序,但我在文档中看不到任何方法。

【问题讨论】:

    标签: python pandas dataframe matplotlib seaborn


    【解决方案1】:

    要使用hue=style=,seaborn 更喜欢long form 中的数据框。 pd.melt() 将合并所有列并使用旧列名创建新列,并为值创建一列。索引也需要转换为常规列(使用.reset_index())。

    大多数 seaborn 函数使用 order= 设置 x 值的顺序,但使用 lineplot 的唯一方法是使列分类应用固定顺序。

    from matplotlib import pyplot as plt
    import seaborn as sns
    import pandas as pd
    import numpy as np
    
    column_tuples = [('20EC-P', 'Pd '), ('20EC-8', 'Di-Grd'), ('20EC-10-1 ', 'Gb'),
                     ('20EC-43', 'Hbl Plag Pd'), ('20EC-45', 'Di-Grd'), ('20EC-54', 'Gb')]
    col_index = pd.MultiIndex.from_tuples(column_tuples, names=["Sample", "Lithology"])
    data = pd.DataFrame(np.random.uniform(0, 50, size=(3, len(col_index))), columns=col_index, index=['Rb', 'Ba', 'Th'])
    
    data_long = data.melt(ignore_index=False).reset_index()
    data_long['index'] = pd.Categorical(data_long['index'], data.index) # make categorical, use order of the original dataframe
    ax = sns.lineplot(data=data_long, x='index', y='value',
                      hue="Lithology", style="Sample", dashes=False, markers=True, palette="deep")
    ax.set_xlabel('')
    
    ax.legend(loc='upper left', bbox_to_anchor=(1.01, 1.02))
    plt.tight_layout()  # fit legend and labels into the figure
    plt.show()
    

    长数据框看起来像:

       index      Sample    Lithology      value
    0     Rb      20EC-P          Pd    6.135005
    1     Ba      20EC-P          Pd    6.924961
    2     Th      20EC-P          Pd   44.270570
    ...
    

    【讨论】:

    • 感谢您的帮助。然而,我又遇到了一个错误。应用了 melt 的行返回错误“TypeError: melt() got an unexpected keyword argument 'ignore_index'”。错误消息只是指向那条线,不会去其他任何地方。这是唯一的错误,如果我在没有 ignore_index 的情况下运行它,它会按原样返回数据帧,但使用 nan 而不是索引的元素名称。
    • 你真的需要升级你的熊猫版本了。
    猜你喜欢
    • 2022-01-13
    • 2021-12-28
    • 2021-10-27
    • 1970-01-01
    • 2021-02-22
    • 2017-11-17
    • 2019-02-17
    • 2021-01-14
    相关资源
    最近更新 更多