在 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 个条目,Lite、Staed 和 ArtYr.
我从来没有做过这样的情节。通常,我有单独的列,但这里的数字排列不同。
如果我为每个 Name
创建 3 个单独的数据帧,那么就可以绘制。但是,Name
列通常有比我显示的 3 个条目更多的条目,因此此方法非常耗时。此外,在 time.i.e 之前不知道条目的数量。这里我显示了 3 个条目,Lite
、Staed
和 ArtYr
,但可能有 50 个或 100 个条目。我无法每次需要生成一个图形时创建 50-100 个数据帧。
如何在同一张图上为每个 Name
值显示 Rm_Log
与 Date
列的重叠图?是否可以让日期在 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()
我在 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 个条目,Lite、Staed 和 ArtYr.
我从来没有做过这样的情节。通常,我有单独的列,但这里的数字排列不同。
如果我为每个 Name
创建 3 个单独的数据帧,那么就可以绘制。但是,Name
列通常有比我显示的 3 个条目更多的条目,因此此方法非常耗时。此外,在 time.i.e 之前不知道条目的数量。这里我显示了 3 个条目,Lite
、Staed
和 ArtYr
,但可能有 50 个或 100 个条目。我无法每次需要生成一个图形时创建 50-100 个数据帧。
如何在同一张图上为每个 Name
值显示 Rm_Log
与 Date
列的重叠图?是否可以让日期在 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()