Home > Blockchain >  matplotlib: Add AxesSubplot instances to a figure
matplotlib: Add AxesSubplot instances to a figure

Time:12-16

I'm going insane here ... this should be a simple exercise but I'm stuck:

I have a Jupyter notebook and am using the result of my code

When instead I want want the subplots to be filled with the figures ...

CodePudding user response:

I basically had to recreate the plot that ruptures.display(data,result) produces, to get my desired figure:

import pandas as pd
import numpy as np
import ruptures as rpt
import matplotlib.pyplot as plt
from matplotlib.ticker import EngFormatter

fig, axs = plt.subplots(len(df.columns), figsize=(22,20), dpi=300)

for index, series in enumerate(df):
    
    resampled = df[series].dropna().resample('6H').mean().pad()
    data = resampled.to_numpy().astype(int)
    
    algo = rpt.KernelCPD(kernel='rbf', min_size=4).fit(data)
    result = algo.predict(pen=3)
    
    # Create ndarray of tuples from the result
    result = np.insert(result, 0, 0) # Insert 0 as first result
    tuples = np.array([ result[i:i 2] for i in range(len(result)-1) ])
    
    ax = axs[index]
    
    # Fill area beween results alternating blue/red
    for i, tup in enumerate(tuples):
        if i%2==0:
            ax.axvspan(tup[0], tup[1], lw=0, alpha=.25)
        else:
            ax.axvspan(tup[0], tup[1], lw=0, alpha=.25, color='red')
    
    ax.plot(data)
    ax.set_title(series)
    ax.yaxis.set_major_formatter(EngFormatter())


plt.subplots_adjust(hspace=.3)
plt.show()

I've wasted more time on this than I can justify, but it's pretty now and I can sleep well tonight :D

enter image description here

  • Related