【问题标题】:Plot sub-sections of Pandas Dataframes in Python - all legend entries in one column在 Python 中绘制 Pandas Dataframes 的子部分 - 一列中的所有图例条目
【发布时间】:2015-05-24 21:12:16
【问题描述】:

我在 Python 2.7 中有以下 Pandas DataFrame。

 Name        Date   Val_Celsius Rm_Log
 Lite  2012-07-17            77     12
 Lite  2012-12-01            76    -21
 Lite  2012-09-01            79     73
 Lite  2013-12-01            78    945
Staed  2012-07-17           105     36
Staed  2012-12-01           104     19
Staed  2012-09-01           102    107
Staed  2013-12-01           104     11
ArtYr  2012-07-17           -11    100
ArtYr  2012-12-01           -14     21
ArtYr  2012-09-01           -10     68
ArtYr  2013-12-01           -12     83

我需要将 Rm_Log 数字绘制为 y 变量,我需要将 Date 绘制为 x 变量。

但是,我需要在同一个图中有 3 个单独的重叠图 - 第一个图是 Lite,第二个是 Staed,第三个是 ArtYr。我需要图例来显示 3 个条目,LiteStaedArtYr

我以前从未做过这样的情节。通常,我有单独的列,但这里的数字排列方式不同。

如果我为每个 Name 创建 3 个单独的 DataFrame,则可以进行绘图。但是,Name 列的条目通常比我展示的 3 个多得多,因此这种方法非常耗时。此外,条目的数量是不知道提前的。即这里我展示了 3 个条目,LiteStaedArtYr,但可能有 50 个或可能有 100 个条目。每次需要生成一个图形时,我无法创建 50-100 个 DataFrame。

对于每个 Name 值,如何在同一图中显示 Rm_LogDate 列的重叠图?是否可以让日期在 x 轴上垂直?

编辑: 使用 ax.set_ticks(df.index) 时出现错误:

  File "C:\Python27\lib\site-packages\matplotlib\axes\_base.py", line 2602, in set_xticks
    return self.xaxis.set_ticks(ticks, minor=minor)
  File "C:\Python27\lib\site-packages\matplotlib\axis.py", line 1574, in set_ticks
    self.set_view_interval(min(ticks), max(ticks))
  File "C:\Python27\lib\site-packages\matplotlib\axis.py", line 1885, in set_view_interval
    max(vmin, vmax, Vmax))
  File "C:\Python27\lib\site-packages\matplotlib\transforms.py", line 973, in _set_intervalx
    self._points[:, 0] = interval
ValueError: invalid literal for float(): 2012-07-17

【问题讨论】:

    标签: python-2.7 pandas plot


    【解决方案1】:

    如果你不想使用原生 pandas 以外的任何东西,你仍然可以很容易地做到这一点:

    df.reset_index().set_index(["Name", "Date"]).unstack("Name")["Rm_Log"].plot(rot=90)
    

    首先,您使用 MultiIndex 对其进行排序,然后将其取消堆叠,以便 Name 列中的每个条目成为其自己的列。然后选择 Rm_Log 列并绘制它。参数 rot=90 旋转 xticks。你也可以把它分成几行,但我想我会把它保留为一行,以展示如何在不修改 DataFrame 的情况下完成它。

    【讨论】:

    • 几个问题。 1.倒数第二行 (ax.set_xticks(df.index)) 似乎不起作用 - 如果我把它排除在外,那么它似乎正在起作用。我已将此作为EDIT 添加到原始帖子中。 2.如何将这样的图形保存到具有白色背景的 *.png 文件中(目前 Python 给出了灰色背景,轴内带有白色 - 我只想到处都是白色)?
    • 用适当的背景颜色保存:ax.gcf.savefig('path/to/where/you/want/to/save.png', facecolor='w')
    • 我找到了一种更简单的旋转刻度的方法。
    【解决方案2】:

    这就是从R 获得灵感的ggplot 绝对是简单的惊人之处,您不必修改数据框。

    from ggplot import *
    
    ggplot(df, aes(x='Date', y='Rm_log', color='Name')) + geom_line()
    

    【讨论】:

      猜你喜欢
      • 2014-04-24
      • 2018-12-23
      • 2013-04-21
      • 2018-06-25
      • 1970-01-01
      • 2022-11-10
      • 2015-06-02
      相关资源
      最近更新 更多