大熊猫-创建大小为n的堆积图

时间:2019-01-29 15:58:55

标签: python pandas matplotlib

我有一个看起来像这样的DataFrame:

                  1         2         3         4    5    6    7    8   9   10 ...  15  16  17   18  19  20  21  22  23  24
Date                                                                           ...                                         
1990-01-02  0.971710  0.027471  0.000819  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0
1990-01-03  0.966265  0.032919  0.000815  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0
1990-01-04  0.970886  0.028280  0.000833  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0
1990-01-05  0.969092  0.030065  0.000842  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0
1990-01-08  0.970326  0.028856  0.000817  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0
1990-01-09  0.969999  0.029176  0.000825  0.000000  0.0  0.0  0.0  0.0   0   0 ...   0   0   0  0.0   0   0   0   0   0   0

我想创建一个堆积图,y轴为0到1,并且该图始终到达y轴的上限(因为水平上所有非nan列的总和始终为1) 。尽管我的许多列都有nans,但我希望我的绘图能够像每列都具有一定的价值一样起作用。我尝试使用以下代码进行此操作:

fig, ax = plt.subplots(figsize=(5, 3))
ax.stackplot(df.index, df, labels=list(df.columns))
ax.set_title('Combined debt growth over time')
ax.legend(loc='upper left')
ax.set_ylabel('Total debt')
ax.set_xlim(xmin=df.index[0], xmax=df.index[-1])
fig.tight_layout()

但是,在上面代码的第二行出现以下错误:

{ValueError}operands could not be broadcast together with shapes (7222,) (24,) 

我必须手动指定每一列吗?有什么聪明的方法可以简单地传递多个?

1 个答案:

答案 0 :(得分:1)

matplotlib.pyplot.stackplot documentation中,第一个参数的尺寸应为N,第二个参数的尺寸应为MxN,因此它期望每一行都具有该尺寸N,但是df.index返回形状为(7222,)的对象(因为df的形状为(7222, 24))。如果您切换df.indexdf.columns(如我所知),则可以在下面的示例中看到这一点。

这里的简单解决方案是简单地转置DataFrame。然后,这将为matplotlib提供对stackplot参数的期望。

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

df = pd.DataFrame([[0.971710, 0.027471, 0.000819, 0.0], 
                   [0.966265, 0.032919, 0.000815, 0.0],
                   [0.970886, 0.028280, 0.000833, 0.0], 
                   [0.969092, 0.030065, 0.000842, 0.0], 
                   [0.970326, 0.028856, 0.000817, 0.0], 
                   [0.969999, 0.029176, 0.000825, 0.0]])
df.index = {"row 1", "row 2", "row 3", "row 4", "row 5", "row 6"}
df.columns = {"column 1", "column 2", "column 3", "column 4"}
plt.stackplot(df.columns, df, labels=list(df.index))
plt.title("Original")
plt.show()
t = df.transpose()
plt.stackplot(t.columns, t, labels=list(t.index))
plt.title("Transposed")
plt.show()

Untransposed dataframe with index and column switched in stackplot

Transposed dataframe result