【问题标题】:Plotting through a subset of data frame in Pandas using Matplotlib使用 Matplotlib 在 Pandas 中绘制数据框的子集
【发布时间】:2017-11-14 13:18:55
【问题描述】:

我有一个数据框,我将数据框分成三个子集。每个子集有 3 到 4 行数据。在我将数据框分成三个子集后,我使用 Matplotlib 绘制它们。

我遇到的问题是我无法创建一个图,其中每个子图都是使用切片 DataFrame 绘制的。例如,在一组三个一组中,我只绘制了一个图(最后一个子图),而其余两个图没有数据,组中的初始集。对于所有三个子图,“r”值似乎都没有传递给“r.plot”。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))

df['key1'] = 0
df.key1.iloc[0:3] = 1
df.key1.iloc[3:7] = 2
df.key1.iloc[7:] = 3

df_grouped = df.groupby('key1')

for group_name, group_value in df_grouped:
     rows, columns = group_value.shape
     fig, axes = plt.subplots(rows, 1, sharex=True, sharey=True, figsize=(15,20))
    for i,r in group_value.iterrows():
        r = r[0:columns-1]
        r.plot(kind='bar', fill=False, log=False)

【问题讨论】:

  • 感谢您提供带有随机数据的可复制示例。但是,我无法完全重现这一点,因为此示例中未定义 rows 变量。你能澄清rows的价值吗?
  • 行是随机数生成器创建的索引 A、B、C 和 D 中的值。此代码应生成一个输出,其中每个子集中仅填充一个子图。第一个子集由 3 行数据组成,第二个集合包含四行数据,第三个集合包含三行数据。每行数据有4个值,索引为a、b、c、d。
  • 对不起,我应该更清楚。您在此行中定义您的rows 变量:rows, columns = group_value.shape,直到您尝试将它与此行一起使用后的三行:fig, axes = plt.subplots(rows, 1, sharex=True, sharey=True, figsize=(15,20))。要运行此代码示例,必须在使用之前定义 rows。这就是我在尝试运行您的代码时遇到的错误。
  • 是的,你是对的。它应该按照您的建议移动。但是,在我的子图中,只绘制了其中一个。这就是我要解决的问题。谢谢。
  • 我还添加了 pyplot 导入

标签: python pandas matplotlib


【解决方案1】:

我认为您可能希望以某种方式对我所说的 df_subset 进行总结,但这里有一种方法可以在自己的面板中绘制每个组。

# Your Code Setting Up the Dataset
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))

df['key1'] = 0
df.key1.iloc[0:3] = 1
df.key1.iloc[3:7] = 2
df.key1.iloc[7:] = 3


# My Code to Plot in Three Panels
distinct_keys = df['key1'].unique()
fig, axes = plt.subplots(len(distinct_keys), 1, sharex=True, figsize=(3,5)) 

for i, key in enumerate(distinct_keys):
    df_subset = df[df.key1==key]

    # {maybe insert a line here to summarize df_subset somehow interesting?}

    # plot
    axes[i] = df_subset.plot(kind='bar', fill=False, log=False)

【讨论】:

  • 谢谢,这在测试用例中有效。但是我的数据集需要做一些工作。我会尽快处理并在这里报告。
猜你喜欢
  • 2017-01-03
  • 2016-06-04
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 2020-08-23
相关资源
最近更新 更多