【问题标题】:pandas data frame plotting in subplots在子图中绘制熊猫数据框
【发布时间】:2021-02-26 23:13:37
【问题描述】:

我有以下 pandas 数据框,并希望在 a1 row 中水平创建 n 绘图,其中 n = unique labels(l1,l2,.)(例如,在以下示例中将有两个绘图,因为l1 and l2)。然后对于这两个图,每个图都将a4 绘制为 x 轴,a3 绘制为 y 轴。例如,ax[0] 将包含 a1 的图表,其中包含三条线,将点 [(1,15)(2,20)],[(1,17)(2,19)],[(1,23)(2,15)] 连接起来以获取以下数据。

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
    d = {'a1': ['l1','l1','l1','l1','l1','l1','l2','l2','l2','l2','l2','l2'],
         'a2': ['a', 'a', 'b','b','c','c','d','d','e','e','f','f'],
         'a3': [15,20,17,19,23,15,22,21,23,23,24,27],
         'a4': [1,2,1,2,1,2,1,2,1,2,1,2]}
    
    df=pd.DataFrame(d)
    df
    a1  a2  a3  a4
    1   a   15  1 
    1   a   20  2
    1   b   17  1
    1   b   19  2
    1   c   23  1
    1   c   15  2
    2   d   22  1
    2   d   21  2
    2   e   23  1
    2   e   23  2
    2   f   24  1
    2   f   27  2

我目前有以下:

def graph(dataframe):
    x = dataframe["a4"]
    y = dataframe["a3"]
    ax[0].plot(x,y) #how do I plot and set the title for each group in their respective subplot without the use of for-loop?
    
fig, ax = plt.subplots(1,len(pd.unique(df["a1"])),sharey='row',figsize=(15,2))
df.groupby(["a1"]).apply(graph)

但是,我上面的尝试只在第一个子图上绘制所有 a3 和 a4(因为我写了ax[0].plot())。我总是可以使用 for 循环来完成所需的任务,但是对于 a1 中的大量唯一组,它的计算成本会很高。有没有办法让它成为ax[0].plot(x,y) 线上的单行代码,并且它可以在没有 for 循环的情况下完成所需的任务?任何意见表示赞赏。

【问题讨论】:

  • df.groupby(["a1"]).plot(x='a4', y='a3', subplots=True)
  • @PaulH 我之前尝试过这种方法,但它显示的图形是垂直堆叠的(我希望它们水平堆叠,这个link 建议我使用subplots 而不是pandas.plot()
  • @JayEstrera 你可以添加layout=(1,2) 让他们水平绘图
  • @a11 我相信在这种情况下,layout=(1,2) 只会拉伸或压缩图形,而不是水平对齐它们
  • 好的,当我将每组 a1 的信息及其各自的索引存储到字典中时,ax[dict.get(pd.unique(dataframe["a1"])[0])].plot(x,y) 让我得到想要的结果

标签: python pandas dataframe matplotlib plot


【解决方案1】:

在使用 pandas 绘制这些数据时,我看不到任何避免 for 循环的方法。我最初的想法是重塑数据框以使subplots=True 工作,如下所示:

dfp = df.pivot(columns='a1').swaplevel(axis=1).sort_index(axis=1)
dfp

但我不知道如何选择列 MultiIndex 的级别 1 以使 dfp.plot(x='a4', y='a3', subplots=True) 之类的东西工作。

删除级别 0,然后运行绘图功能 dfp.droplevel(axis=1, level=0).plot(x='a4', y='a3', subplots=True) 提高 ValueError: x must be a label or position。即使这样可行,仍然存在将正确的点连接在一起的问题。

创建seaborn package 是为了方便地绘制这种数据集。如果您愿意使用它,这里是relplot 的示例:

import pandas as pd    # v 1.1.3
import seaborn as sns  # v 0.11.0

d = {'a1': ['l1','l1','l1','l1','l1','l1','l2','l2','l2','l2','l2','l2'],
     'a2': ['a', 'a', 'b','b','c','c','d','d','e','e','f','f'],
     'a3': [15,20,17,19,23,15,22,21,23,23,24,27],
     'a4': [1,2,1,2,1,2,1,2,1,2,1,2]}
df = pd.DataFrame(d)

sns.relplot(data=df, x='a4', y='a3', col='a1', hue ='a2', kind='line', height=4)

您可以使用palette 参数自定义颜色,并使用col_wrap 调整网格布局。

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 2018-03-19
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2018-04-06
    • 2017-12-16
    • 2017-10-10
    相关资源
    最近更新 更多