【问题标题】:Plotting a timeseris graph from pandas dataframe using matplotlib使用 matplotlib 从 pandas 数据帧绘制时间序列图
【发布时间】:2016-02-22 14:52:58
【问题描述】:

我在 csv 文件中有以下数据

   SourceID    BSs   hour   Type
    7208       87     11    MAIN
    11060      67     11    MAIN
    3737       88     11    MAIN
    9683       69     11    MAIN

我有以下 python 代码。我想绘制具有以下规格的图形。

对于每个SourceIDType,我想绘制BSs 随时间变化的图表。如果每个SourceIDType 都是单个情节上的子情节,我会更喜欢。我已经尝试了很多使用 groupby 的选项,但似乎无法让它工作。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

COLLECTION = 'NEW'
DATA = r'C:\Analysis\Test\{}'.format(COLLECTION)
INPUT_FILE = DATA + r'\in.csv'
OUTPUT_FILE = DATA + r'\out.csv'


with open(INPUT_FILE) as fin:
    df = pd.read_csv(INPUT_FILE,
                  usecols=["SourceID", 'hour','BSs','Type'],
                  header=0)

    df.drop_duplicates(inplace=True)

    df.reset_index(inplace=True)

【问题讨论】:

  • 你能展示一下你到目前为止所尝试的吗?我在这里没有看到任何绘图代码。
  • @ali_m - 我已经更新了绘图代码。但它给出了一些奇怪的情节。
  • IndexError 是我的错——我的代码将nrows 设置得太小,以至于在ngrps 不能被ncols 整除的情况下无法容纳所有图。这是因为我在做地板除法ngrps // ncols,而不是天花板除法-(-ngrps // ncols)。这现在在我的回答中得到了解决。
  • 警告无需担心 - 只要只有一个点要绘制,就会出现警告,因此当轴自动缩放时,下限和上限设置为相同的值。这没关系,因为我在最后手动设置了轴限制。您可以通过在绘图时设置 x 轴限制(例如,通过将 xlim= 关键字参数传递给 rows.plot(..))或通过将 scalex=False, scaley=False 传递给以防止轴自动缩放来消除警告rows.plot()。我对我的答案进行了后者的更改。
  • @ali_m - 即使在 rows.plot() 中将 scalexscaley 设置为 false 后,警告仍然存在。我现在并不太担心。请参阅下面的评论关于新错误。谢谢。

标签: python-3.x numpy pandas matplotlib graph


【解决方案1】:

我仍然不是 100% 清楚你真正想要什么样的情节,但我猜你正在寻找这样的东西:

from matplotlib import pyplot as plt

# group by SourceID and Type, find out how many unique combinations there are
grps = df.groupby(['SourceID', 'Type'])
ngrps = len(grps)

# make a grid of axes
ncols = int(np.sqrt(ngrps))
nrows = -(-ngrps // ncols)

fig, ax = plt.subplots(nrows, ncols, sharex=True, sharey=True)

# iterate over the groups, plot into each axis
for ii, (idx, rows) in enumerate(grps):
    rows.plot(x='hour', y='BSs', style='-s', ax=ax.flat[ii], legend=False,
              scalex=False, scaley=False)

# hide any unused axes
for aa in ax.flat[ngrps:]:
    aa.set_axis_off()

# set the axis limits
ax.flat[0].set_xlim(df['hour'].min() - 1, df['hour'].max() + 1)
ax.flat[0].set_ylim(df['BSs'].min() - 5, df['BSs'].max() + 5)

fig.tight_layout()

【讨论】:

  • 是的,这正是我想要的。但是,如果我在我的数据集上使用您的代码,我会收到一些警告和错误。请参阅上面的详细信息。
  • 我没有得到底行 x 轴上的小时值。`由于某种原因,我只得到一个值 13。
  • 我对这种方法有一个小问题。 value rangesMAIN BSsSUB BSs 不在同一范围内。我看到你设置了 sharey=True。我们可以将这两组图表输出到不同的图表吗?
  • 我不太清楚你所说的“将这两组图表输出到不同的图表”是什么意思。一个简单的选项是设置 sharey=False 并省略末尾的 set_ylim 行,以允许每组轴独立缩放其 y 轴。
  • 在这种情况下,首先按Type 分组,在这个外部循环中创建一个图形和子图,然后遍历SourceIDs 并填充子图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2017-10-08
  • 2018-02-27
  • 2020-12-04
相关资源
最近更新 更多