我有一个看起来像这样的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,)
我必须手动指定每一列吗?有什么聪明的方法可以简单地传递多个?
答案 0 :(得分:1)
在matplotlib.pyplot.stackplot
documentation中,第一个参数的尺寸应为N
,第二个参数的尺寸应为MxN
,因此它期望每一行都具有该尺寸N
,但是df.index
返回形状为(7222,)
的对象(因为df
的形状为(7222, 24)
)。如果您切换df.index
和df.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()