在 Python 中绘制 Pandas 数据帧的子部分 - 一列中的所有图例条目

Plot sub-sections of Pandas Dataframes in Python - all legend entries in one column

我在 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 个单独的数据帧,那么就可以绘制。但是,Name 列通常有比我显示的 3 个条目更多的条目,因此此方法非常耗时。此外,在 time.i.e 之前不知道条目的数量。这里我显示了 3 个条目,LiteStaedArtYr,但可能有 50 个或 100 个条目。我无法每次需要生成一个图形时创建 50-100 个数据帧。

如何在同一张图上为每个 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

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

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

首先,您使用 MultiIndex 对其进行排序,然后对其进行拆分,以便名称列中的每个条目都成为其自己的列。然后你 select Rm_Log 列并绘制它。参数 rot=90 旋转 xticks。你也可以把它分成几行,但我想我会把它作为一行来展示如何在不修改 DataFrame 的情况下完成它。

这就是 ggplot 灵感来自 R 的简单之处,您无需修改​​数据框。

from ggplot import *

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