Fill_between of a stacked data block

I have the following framework:

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

Then I add and order the data frame and build the result as a barcode as follows:

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

What I'm trying to do now (without success) is not to build it like a barcher, but instead build it by filling in the area below and above zero. I assume I should use fill_between, similar to these examples: 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)

I get an error: 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''

+4
source share
3 answers

Are you trying 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

And then install axis xfrom 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

+3
source

width edgecolor plt.bar, , .

x=[1,2,3,4,5,6]
y=[-3,-1,5,3,4,2]

plt.bar(x,y,color='b',width=1,edgecolor="none")

enter image description here

+4

Your syntax is a bit off. In your case, you fill_betweenneed the X values, then the Y value you want to fill in, and then your Y values.

Here is a small example:

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 the curve

Then you can use indexfor set_xticklabels.

+3
source

Source: https://habr.com/ru/post/1627119/


All Articles