fill_between来自堆叠的数据框

时间:2016-02-03 09:39:32

标签: python pandas matplotlib

我有以下数据框:

symbol       DAL        MS       QQQ       SPY      TLT  XLE
symbol                                                      
DAL          NaN       NaN       NaN       NaN      NaN  NaN
MS      0.560979       NaN       NaN       NaN      NaN  NaN
QQQ     0.621045  0.789771       NaN       NaN      NaN  NaN
SPY    -0.576444 -0.843485 -0.953304       NaN      NaN  NaN
TLT     0.186840  0.421957  0.333320 -0.347808      NaN  NaN
XLE     0.115093  0.578970  0.559711 -0.701126  0.38047  NaN

然后我堆叠并订购数据框并将结果绘制成条形图,如下所示:

dfstacked = corr_df.stack().order()
dfstacked.plot(kind='bar')

symbol  symbol
SPY     QQQ      -0.953304
        MS       -0.843485
XLE     SPY      -0.701126
SPY     DAL      -0.576444
TLT     SPY      -0.347808
XLE     DAL       0.115093
TLT     DAL       0.186840
        QQQ       0.333320
XLE     TLT       0.380470
TLT     MS        0.421957
XLE     QQQ       0.559711
MS      DAL       0.560979
XLE     MS        0.578970
QQQ     DAL       0.621045
        MS        0.789771

enter image description here

我现在尝试做的事情(没有成功)不是将其绘制为条形图,而是通过填写零下方和零区以上的区域来绘制它。我的猜测是我应该使用类似于这些示例的fill_between:link

ax.fill_between(dfstacked.index, 0, dfstacked.values, where = dfstacked.values > 0, interpolate=True)
ax.fill_between(dfstacked.index, dfstacked.values, 0, where = dfstacked.values < 0, interpolate=True)

我收到错误:TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

3 个答案:

答案 0 :(得分:4)

您尝试reset_index

dfstacked = dfstacked.reset_index(drop=True)
print dfstacked
0    -0.953304
1    -0.843485
2    -0.701126
3    -0.576444
4    -0.347808
5     0.115093
6     0.186840
7     0.333320
8     0.380470
9     0.421957
10    0.559711
11    0.560979
12    0.578970
13    0.621045
14    0.789771
dtype: float64

然后从axis x设置multiindex

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker


dfstacked = corr_df.stack().order()

ticklabels = dfstacked.index.tolist()

dfstacked = dfstacked.reset_index(drop=True)
print dfstacked


ax = dfstacked.plot()

ax.fill_between(dfstacked.index, 0, dfstacked.values, where = dfstacked.values > 0, interpolate=True)
ax.fill_between(dfstacked.index, dfstacked.values, 0, where = dfstacked.values < 0, interpolate=True)
ax.xaxis.set_major_formatter(ticker.FixedFormatter(ticklabels))
plt.xticks(rotation=90)    
plt.show()

graph01

答案 1 :(得分:4)

您可以使用width的{​​{1}}和edgecolor参数来获得看起来不像直方图的内容。

plt.bar

enter image description here

答案 2 :(得分:3)

你的语法有点偏。在您的情况下,fill_between需要X值,然后需要填充的Y值,然后是Y值。

这是一个小例子:

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

s = pd.Series([-4,-3,-2,-1,0,1,2,3,4,5,6,7,8])
x = np.arange(len(s))
plt.fill_between(x,0,s)

area under curve

然后,您可以使用indexset_xticklabels