【问题标题】:How to plot a multiple line plot in Seaborn using specific columns?如何使用特定列在 Seaborn 中绘制多线图?
【发布时间】:2020-09-01 23:06:04
【问题描述】:

我有一个类似这种格式的更大数据框:

df = pd.DataFrame([{'name': 'A', '2015': 99, '2016':98, '2017': '95', '2018':'99'}, {'name': 'B', '2015': 76, '2016':89, '2017': 83, '2018': 85}, {'name': 'C', '2015': 88, '2016':89, '2017': 91, '2018':91}])

df.set_index('name', inplace=True)

我想在多线图中绘制 2016 年和 2018 年的 A、B 和 C。搜索了一段时间后,我似乎不知道如何从数据框中绘制特定列。最佳做法是为每个地块创建一个新的地块吗?

【问题讨论】:

  • 不,只是创建示例时出现复制粘贴错误。感谢您指出这一点,已修复
  • 您想要 x 轴上的年份?
  • 是的,x 轴是年份,y 轴是那些年份的每个“名称”的值

标签: python pandas dataframe plot seaborn


【解决方案1】:

假设您在列和值中有数字数据,您可以简单地融化您的数据框并调用线图。

sns.lineplot(data=df.melt(id_vars=['name']), 
             x='variable', y='value', hue='name')

【讨论】:

    【解决方案2】:

    这里我假设年份是字符串,值是整数。

    Seaborn 要求数据格式整齐,因此您首先可以转换数据框。

    import seaborn as sns
    import pandas as pd
    
    
    df = pd.DataFrame(
        [
            {"name": "A", "2015": 99, "2016": 98, "2017": 95, "2018": 99},
            {"name": "B", "2015": 76, "2016": 89, "2017": 83, "2018": 85},
            {"name": "C", "2015": 88, "2016": 89, "2017": 91, "2018": 91},
        ]
    )
    
    df.set_index("name", inplace=True)
    tidy = df.stack().reset_index().rename(columns={"level_1": "year", 0: "values"})
    

    这是结果

        name    year    values
    0   A   2015    99
    1   A   2016    98
    2   A   2017    95
    3   A   2018    99
    4   B   2015    76
    5   B   2016    89
    6   B   2017    83
    7   B   2018    85
    8   C   2015    88
    9   C   2016    89
    10  C   2017    91
    11  C   2018    91
    

    那么,你可以

    1. 根据您想要的年份过滤它
    2. 将其作为data 参数传递
    3. 指定xyhue 处的列
    sns.lineplot(
        data=tidy[tidy["year"].isin(["2016", "2018"])], x="year", y="values", hue="name"
    )
    

    结果

    【讨论】:

      猜你喜欢
      • 2021-04-26
      • 1970-01-01
      • 2017-11-17
      • 2021-05-19
      • 2017-11-24
      • 2019-07-29
      • 1970-01-01
      • 2020-06-22
      • 2021-11-23
      相关资源
      最近更新 更多