File size: 2,832 Bytes
025632f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# -*- coding: utf-8 -*-
"""
Created on Tue Jan  4 18:23:14 2022

@author: bullm
"""
import plotly.graph_objects as go
import plotly.express as px
import pandas as pd
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt

# path = 'C:\\Users\\bullm\\Desktop\\Portal_LVAM\\Data\\'
# for key in stats_competencia.keys():
#     print(key)
#     stats_competencia[key].to_excel(path+key+'.xlsx')
# tabla_factores_general.to_excel(path+'factores_general.xlsx')

def spider_plot(df, title, alpha=0.1, n_dec=1, y=[]):

    if len(y) == 0:
        min_val = df.min().min()
        min_val = np.floor(min_val-np.abs(min_val)*alpha, n_dec)
        max_val = df.max().max()
        max_val = np.ceil(max_val+np.abs(max_val)*alpha, n_dec)
        mean_val = np.round((min_val + max_val)/2, 1)

        y = [min_val, mean_val, max_val]

    categories = list(df.index)
    N = df.shape[0]

    # We are going to plot the first line of the data frame.
    # But we need to repeat the first value to close the circular graph:
    values = np.round(df.iloc[:, 0].values.flatten().tolist(), 2)
    values = np.hstack((values, values[0])).T

    values2 = np.round(df.iloc[:, 1].values.flatten().tolist(), 2)
    values2 = np.hstack((values2, values2[0])).T

    # What will be the angle of each axis in the plot?
    angles = [n / float(N) * 2 * np.pi for n in range(N)]
    angles += angles[:1]

    # Initialise the spider plot
    fig = plt.figure(figsize=(10, 15))
    ax = plt.subplot(111, polar=True)
    ax.set_title(title, fontsize=20)

    # Draw one axe per variable + add labels labels yet
    plt.xticks(angles[:-1], categories, color="black", size=18)

    # Draw ylabels
    ax.set_rlabel_position(0)
    plt.yticks(y, [str(i) for i in y], color="black", size=15)
    plt.ylim(y[0], y[-1])



    # Plot data
    ax.plot(angles, values, linewidth=1, linestyle='solid', c='dimgrey')
    ax.plot(angles, values2, linewidth=1, linestyle='solid', c='darkred')

    handles, labels = ax.get_legend_handles_labels()

    ax.legend(labels=['Cartera', 'Benchmark'], loc='lower left',
              fontsize=15, bbox_to_anchor=(-0.1, -0.1))

    # Fill area
    ax.fill(angles, values, 'b', alpha=0.1)

    return fig


def panel_de_control():
    df = pd.read_excel("Data/factores_general.xlsx")

    radar = go.Scatterpolar(
       r = list(df["Benchmark"]),
       theta = list(df['Unnamed: 0']),
       fill = 'toself'
    )
    radar2 = go.Scatterpolar(
       r = list(df["Cartera"]),
       theta = list(df['Unnamed: 0']),
       fill = 'toself'
    )
    data = [radar, radar2]
    fig = go.Figure(data = data)
    col1, col2 = st.columns(2)
    col1.plotly_chart(fig, use_container_width=True)
    df.index= df['Unnamed: 0']
    df = df[["Cartera", 'Benchmark']]
    col2.pyplot(spider_plot(df, '', y=[0, 50, 100] ))