使用Pandas DataFrame在python中创建堆积区域图

时间:2017-10-13 21:02:05

标签: python pandas matplotlib

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt

dates = np.arange(1990,2061, 1)
dates = dates.astype('str').astype('datetime64')

df = pd.DataFrame(np.random.randint(0, dates.size, size=(dates.size,3)), columns=list('ABC'))
df['year'] = dates

cols = df.columns.tolist()
cols = [cols[-1]] + cols[:-1]
df = df[cols]

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

ax.stackplot(df['year'], df.drop('year',axis=1))

基于此代码,我收到错误“输入类型不支持TypeError:ufunc'isfinite',并且输入无法根据强制转换规则”安全“安全地强制转换为任何支持的类型“

我正在试图弄清楚如何在第一列中绘制具有年份的DataFrame对象,然后在后续列(A,B,C)中绘制堆积区域。

此外,由于我在这里是一个完全的初学者...随意评论我的代码,以使其更清洁/更好。我明白,如果我使用Matplotlib而不是Pandas集成绘图方法,那我以后会有更多功能来调整内容吗?

谢谢!

1 个答案:

答案 0 :(得分:8)

运行代码时遇到两个问题。

首先,stackplot似乎不喜欢使用日期的字符串表示。日期时间数据类型有时非常挑剔。要么使用“年份”列的整数,要么使用.values将pandas转换为numpy数据类型,如this question

中所述

其次,根据documentation for stackplot,当stackplot(x, y)呼叫x是Nx1数组时,y必须是MxN,其中M是列数。您的df.drop('year',axis=1))将以NxM结尾,并向您抛出另一个错误。但是,如果你采用转置,你就可以使它成功。

如果我只用

替换你的最后一行
ax.stackplot(df['year'].values, df.drop('year',axis=1).T)

我得到的情节如下:

enter image description here