Cesar
Cesar

Reputation: 617

Graph only shows the data in 1 graph but not the other

I'm having trouble with my code. It's only showing the data for one graph and the other graph is blank. I can't figure why it's not working.
I'm using the subplot() function and my guess is that the the reason might be the way my function are formatted.

import numpy as np
import matplotlib.pyplot as plt
import cvxopt as opt
from cvxopt import blas, solvers
import pandas as pd
import mpld3
from mpld3 import plugins

np.random.seed(123)
solvers.options['show_progress'] = False

n_assets = 4

n_obs = 1000  # original 1000

return_vec = np.random.randn(n_assets, n_obs)

def rand_weights(n):
    k = np.random.rand(n)
    return k / sum(k) print(rand_weights(n_assets)) print(rand_weights(n_assets))

def random_portfolio(returns):
    p = np.asmatrix(np.mean(returns,axis=1))
    w = np.asmatrix(rand_weights(returns.shape[0]))
    C = np.asmatrix(np.cov(returns))

    mu = w * p.T
    sigma = np.sqrt(w * C * w.T)

    #this recursion reduces outlier to keep the graph nice
    if sigma > 2:
      return random_portfolio(returns)
    return mu, sigma

n_portfolios = 500

means, stds = np.column_stack([random_portfolio(return_vec) for _ in range(n_portfolios)])


plt.plot(return_vec.T, alpha=.4); 
plt.xlabel('time') 
plt.ylabel('returns') 
plt.figure(1) 
plt.subplot(212)

plt.plot(stds, means, 'o', markersize = 5) 
plt.xlabel('std') 
plt.ylabel('mean') 
plt.title('Mean and standard deviation of returns of randomly generated portfolios') 
plt.subplot(211) 
plt.figure(1)

plt.show()

my graph

Upvotes: 1

Views: 113

Answers (1)

bpachev
bpachev

Reputation: 2212

You need to move the line plt.subplot(211) before your first call to plt.plot. This is because calls to plt.subplot must precede the actual plotting in that subplot.

Upvotes: 2

Related Questions