From e3b03866dd31e287ca816c262b075889b9f26294 Mon Sep 17 00:00:00 2001 From: Marilyne HU <marilyne.hu@student-cs.fr> Date: Sat, 5 Apr 2025 15:44:23 +0200 Subject: [PATCH] update new fonctionnality - encadrer --- __pycache__/utils_graph.cpython-312.pyc | Bin 7735 -> 7721 bytes app.py | 8 +- data/data_generate.ipynb | 147 +++++++++++++++++- onglets/__pycache__/onglet1.cpython-312.pyc | Bin 7165 -> 8640 bytes onglets/__pycache__/onglet2.cpython-312.pyc | Bin 0 -> 1887 bytes onglets/onglet1.py | 56 ++++--- onglets/onglet2.py | 36 +++++ utils/__pycache__/utils_graph.cpython-312.pyc | Bin 7271 -> 7656 bytes utils/utils_graph.py | 14 +- utils/utils_hist.py | 21 +++ 10 files changed, 251 insertions(+), 31 deletions(-) create mode 100644 onglets/__pycache__/onglet2.cpython-312.pyc create mode 100644 utils/utils_hist.py diff --git a/__pycache__/utils_graph.cpython-312.pyc b/__pycache__/utils_graph.cpython-312.pyc index 764d9f4d7ce68a27ea9b5961014d09a63ac6f7d0..4a0e69a1eae5ce45a8f2be1e5dff6310d90176fc 100644 GIT binary patch delta 48 zcmdmPv(kp^G%qg~0}$AK-^k_6#N?Vh*`G;8ptz(cH8D3QvqZO`C_gJTdGkc3Wzqmw Ckq=b> delta 62 zcmZ2!v)zX4G%qg~0}yQbyphY9i7D85vOklGoSVO&bBL$EU$8<zWQd2qUrcdHQEFmt QPG(7bNow)tW~OD*06ZcSzW@LL diff --git a/app.py b/app.py index 8ee249a..bc8921e 100644 --- a/app.py +++ b/app.py @@ -8,11 +8,15 @@ from io import BytesIO import utils.utils_graph as utils_graph from utils.utils_graph import plot_graph -from onglets import onglet1 +from onglets import onglet1, onglet2 st.title('Logiciel cartographique') option = st.sidebar.selectbox("Choisir le format du graphique :", ("Graphique en barre horizontale","Histogramme")) if option == "Graphique en barre horizontale" : - onglet1.display() \ No newline at end of file + onglet1.display() + +if option == "Histogramme" : + onglet2.display() + diff --git a/data/data_generate.ipynb b/data/data_generate.ipynb index b04aa65..0e56755 100644 --- a/data/data_generate.ipynb +++ b/data/data_generate.ipynb @@ -12,7 +12,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -21,7 +21,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -151,7 +151,7 @@ "[100 rows x 4 columns]" ] }, - "execution_count": 5, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -159,11 +159,148 @@ "source": [ "df" ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>denomination_cfa</th>\n", + " <th>count</th>\n", + " <th>numero_color</th>\n", + " <th>name_legend</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>CFA_1</td>\n", + " <td>44</td>\n", + " <td>0</td>\n", + " <td>couleur 1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>CFA_2</td>\n", + " <td>47</td>\n", + " <td>1</td>\n", + " <td>couleur 2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>CFA_3</td>\n", + " <td>64</td>\n", + " <td>1</td>\n", + " <td>couleur 2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>CFA_4</td>\n", + " <td>67</td>\n", + " <td>3</td>\n", + " <td>couleur 4</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>CFA_5</td>\n", + " <td>67</td>\n", + " <td>0</td>\n", + " <td>couleur 1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>CFA_6</td>\n", + " <td>9</td>\n", + " <td>0</td>\n", + " <td>couleur 1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>CFA_7</td>\n", + " <td>83</td>\n", + " <td>1</td>\n", + " <td>couleur 2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>CFA_8</td>\n", + " <td>21</td>\n", + " <td>2</td>\n", + " <td>couleur 3</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>CFA_9</td>\n", + " <td>36</td>\n", + " <td>4</td>\n", + " <td>couleur 5</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>CFA_10</td>\n", + " <td>87</td>\n", + " <td>2</td>\n", + " <td>couleur 3</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " denomination_cfa count numero_color name_legend\n", + "0 CFA_1 44 0 couleur 1\n", + "1 CFA_2 47 1 couleur 2\n", + "2 CFA_3 64 1 couleur 2\n", + "3 CFA_4 67 3 couleur 4\n", + "4 CFA_5 67 0 couleur 1\n", + "5 CFA_6 9 0 couleur 1\n", + "6 CFA_7 83 1 couleur 2\n", + "7 CFA_8 21 2 couleur 3\n", + "8 CFA_9 36 4 couleur 5\n", + "9 CFA_10 87 2 couleur 3" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "streamlit_env", + "display_name": "base", "language": "python", "name": "python3" }, @@ -177,7 +314,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.16" + "version": "3.12.7" } }, "nbformat": 4, diff --git a/onglets/__pycache__/onglet1.cpython-312.pyc b/onglets/__pycache__/onglet1.cpython-312.pyc index 1ff1334974f64fdca5dd440f8446d4991fcbb0ae..e06d98b9ddaddfe716d8f0e3f5f19e551df02c85 100644 GIT binary patch delta 4250 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 I&<lwFU&~hqw*UYD delta 2908 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 Y8V-~ghJ6YcI9D^Kxvapny!4g)ABi+<)c^nh diff --git a/onglets/__pycache__/onglet2.cpython-312.pyc b/onglets/__pycache__/onglet2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c09264a0509b4a4a92940790572ca16f12b2b8e9 GIT binary patch literal 1887 zcmb7EO-vg{6rNrG>>Aqv+x)cRC)*H-S_rF6FBPRdgp|@$O(l{zk>hr?><)OX_3mnB z7cd1iNR<*!gcBT_Q?RI%D|arDdI8y~rGZFDRS&&U(Nj;IS+m$AaOhZ?_ulOHzV|nt z-{SE$K-YNY@7c8=0DmyUUy)PgWPk%;186|w43OhI$>#!8@<y-}%7r-gEntL8LQe2> z&Jc5=hl}JQP%L)(lucReY3jZPBNrmy_rEvgCCJ_;!q+ZA_WR$P61H#CI@!{KT4+1a z(ET%Cp4Qh<O5_q$5C05u$ugG~{$lVuX^w;)OD@0#stGsC4#Z!7x5#HQB;-1}fz<|S zW2gNFEXv7|*I(x}Isiq!71q!-&d*>OEP<8!5-2kNx7ISZ#1)0N4ymc}zBd|n{JDan zH~aJGCEz2M`Id}g=TXek0zQ%h=JX|TgFXf)E<uER#JS9_yc_R-WES>0X=Yt5Rdl?| zstHYO3o>~DQoIm(!QK9e*CM~RZJ$n&17-S4NAI{JlytnHpjn8dISWggWtzJch$U!B zGZrc-j+9aHoMgFDX2HM<nZ+Qp-4CeWgsv8J>NkEjE2)fQw<0NXP?fN&s=He_vl#Mx zs0(#<2U}deTu`BLv6DN&aE;I!lx9wYn3hR-ZQDZ5ZY3jSp{pAPTx@XABwX_>QKovi zx_y)?t7BI&bgVc!rO;?;XEl!AqkoB%i=nJqrlaU4MDo0@IfZnT@Yo^o8Qp-gYa5oL zK}3S4Qi4Q;riSNrr$BgHBO-!|Cew}(fmIDLCT-pkWEGMSM94xUT%ah*5YZGznL(5$ z9U##LvCM)Hk?kHougzfg7nCIF-$&!4`TH0moL5W@mh!hO)h$8O!TE0$q#I=u%9Ho= zU+IoySgK-3HnNIPb@JGuIg||D8SzgnbJl>=uOV+_>@pEF9ovRdM(o*RmmBZU?J+n^ zcGi>E_LJB42B)gYyN|y)5|Vquz;PIKUahAF_fvyUMQX%4>(RdbXy0bG7QKF$NNx14 z_ijF_CelxD9>%V$-Cn)D*E9M$_SsRqs~#WNj}L6l*WyE4pVo)R_J_xIvbEt`%&ULB zfAhy`Vz|X?>~-w(f5IT%zBai!x!3i5E%pO7Bhj_UYGg0@QBC~#P;6U^t;U{BZQc7_ zym34P#H%MXcaTnz$XV@3q$eb7)7B{%vDbnm=zXTsbPRnuqgsZAFk-DHylx@(bddlq zW5QdQ1Z{;*IIP$<9XAn_Y3v;Yi<WM(&Y{L#kiF^2GD&!EX~x^-S)|wnI$!p@HVm)F z6@cEOK~Oh~B#xCV%{AZ`=tF9<cNXXAb{yb1?j#Jjo&%721FpXT-3OrU07Q;J;EA{* zK51WRf5vYJ>%vC+diyW@3*ou&BKADCHTCjA<-tq2BJVt`j!e7?zM8E{*=omw8hH38 N7&-}dbDwz8{{u91vugkV literal 0 HcmV?d00001 diff --git a/onglets/onglet1.py b/onglets/onglet1.py index 5094413..e92991a 100644 --- a/onglets/onglet1.py +++ b/onglets/onglet1.py @@ -1,3 +1,5 @@ +# Onglet pour tracer les histogrammes en barre horizontable + import streamlit as st import pandas as pd from matplotlib.colors import to_hex @@ -32,7 +34,7 @@ def display() : # visualisation des données st.header('Visualisation des données :') - st.write(df.head(5)) # pour 5 lignes + st.dataframe(df, use_container_width=True) # bloc sur les infos du dataframe st.subheader('Information sur les données :') @@ -44,20 +46,26 @@ def display() : st.write(df.dtypes) st.subheader('Choix d\'option :') - if df.shape[0]>12 : - nb_line = st.number_input( - "Nombre de lignes à afficher", - min_value=1, - max_value=len(df), - value=5, - step=1, - format="%d" # ↠force l'affichage et le retour d'un entier - ) + nb_line = st.number_input( + "Nombre de lignes à afficher", + min_value=1, + max_value=len(df), + value=5, + step=1, + format="%d" # ↠force l'affichage et le retour d'un entier + ) # choix des colonnes à tracer columns = df.columns.tolist() - col_x = st.selectbox('Choisir la colonne des valeurs (x)', columns) + float_cols = df.select_dtypes(include=['float', 'int']).columns + + if len(float_cols) > 0: + default_index = columns.index(float_cols[0]) + col_x = st.selectbox("Choisir la colonne des valeurs (x)", columns, index=default_index) + else: + col_x = st.selectbox("Choisir la colonne des valeurs (x)", columns) + col_y = st.selectbox('Choisir la colonne des catégories (y)', columns) title_choice = st.checkbox("Voulez-vous mettre un titre au graphique ?") @@ -66,7 +74,8 @@ def display() : else: title = None - model_graph = utils_graph.plot_graph(df = df.loc[:nb_line-1, :], x = col_x, y = col_y) + # création du modèle de graphe et message si erreur pour la sélection des colonnes + model_graph = utils_graph.plot_graph(df = df.loc[:nb_line-1, :], x = col_x, y = col_y, figsize=(13, nb_line*0.7)) col_nombre, col_pourcentage = st.columns(2) @@ -77,7 +86,7 @@ def display() : else: xlabel = None - nombre_choice = st.checkbox('Mettre la valeur ?') + nombre_choice = st.checkbox('Afficher la valeur absolue de chaque barre ?') if nombre_choice : nombre = st.selectbox('Nom de la colonne des valeurs :', columns) else : @@ -90,25 +99,31 @@ def display() : else: ylabel = None - pourcentage_choice = st.checkbox('Mettre le pourcentage ?') + pourcentage_choice = st.checkbox('Afficher le pourcentage de chaque barre ?') if pourcentage_choice : pourcentage = st.selectbox('Nom de la colonne des pourcentages :', columns) else : pourcentage = None - legend_choice = st.checkbox('Voulez-vous mettre une légende de couleurs ?') + # partie encadrement + options = df[col_y] + encadrement_choice = st.checkbox('Voulez-vous mettre en avant une barre ?') + if encadrement_choice : + selection = st.multiselect("Choisissez les CFA à encadrer :", options) + else : + selection = None - #annotation = st.checkbox('Voulez-cous mettre une annotation ?') - #if annotation : - # col_nombre = st.selectbox('Colonne des valeurs absolues', columns) + # partie pour la couleur des barres et de la légende + + legend_choice = st.checkbox('Voulez-vous mettre une légende de couleurs ?') - if legend_choice: col_color = st.selectbox('Choisir la colonne des numéros de couleurs', columns) try : # Premier tracé pour générer list_colors model_graph.barh_subplot(colors=col_color, show=False, title= title, xlabel= xlabel, ylabel=ylabel) + colors_rgba = model_graph.list_colors custom_colors = {} @@ -143,6 +158,7 @@ def display() : ) model_graph.annotation(pourcentage= pourcentage, Nombre= nombre) + model_graph.encadrer(selection=selection) st.pyplot(barh) @@ -153,6 +169,8 @@ def display() : # Tracer sans légende barh = model_graph.barh_subplot(title= title, xlabel= xlabel, ylabel= ylabel, show=False) model_graph.annotation(pourcentage= pourcentage, Nombre= nombre) + model_graph.encadrer(selection=selection) + st.pyplot(barh) if 'barh' in locals(): diff --git a/onglets/onglet2.py b/onglets/onglet2.py index e69de29..e1cc3ec 100644 --- a/onglets/onglet2.py +++ b/onglets/onglet2.py @@ -0,0 +1,36 @@ +# Onglet pour tracer les histogrammes en barre horizontable + +import streamlit as st +import pandas as pd +from matplotlib.colors import to_hex +from io import BytesIO +import sys +import os + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'utils'))) + +import utils.utils_graph as utils_graph + +def display() : + upload_file = st.file_uploader('Charger vos données en format .csv ou .xlsx.') + + if upload_file is not None : + + # chargement des données + filename = upload_file.name + + # vérifie la forme des données + if filename.endswith('.csv'): + df = pd.read_csv(upload_file) + st.success("Fichier CSV chargé avec succès.") + + elif filename.endswith('.xlsx') or filename.endswith('.xls'): + df = pd.read_excel(upload_file) + st.success("Fichier Excel chargé avec succès.") + + else: + st.error("Format de fichier non supporté. Veuillez charger un .csv ou un .xlsx.") + + # visualisation des données + st.header('Visualisation des données :') + st.dataframe(df, use_container_width=True) \ No newline at end of file diff --git a/utils/__pycache__/utils_graph.cpython-312.pyc b/utils/__pycache__/utils_graph.cpython-312.pyc index ea4c79ac17785b3e3b8ee181f5d9b7f84ff1dd50..92e5e96d7c12e3e383c07d41a10a8ccc3aa0c2d9 100644 GIT binary patch delta 1458 zcmaJ>O>7%Q6rS1Lc-MB;Ywxbt8#_Nvsgd2ZA!$QW)QAF!(pChgC_#ll2#$9N4vw9! zT@s=-2?8Wq1={Exhy<#V3vHAthz1FSxKIQLIM6_$#o_=bK)oc*feQy_*LD(Bf+y`a zGw*%x&Aj(!_K(AV9^t>^c^4w`PSfV-Zy)lHP<RMVQW4*=R6d-}CKKuKgpnQ7lX=Kf z^8vx4mW3lDO};G$2etGYypW_uQIZ-8B2*Aym2T(|R&a@H;JF%8n5X7y8C38VguJ^P z1DW0mN5j)ZS@7j~cu2n2p-~z(ebB-j;l*;`C^3sxU@XD{6A{E3;y{A#BS9r%IZ4-g zyV3ayJyfB0h?PAIN@Fruvz+RPlUxupyvfeGHDsb;=k}S{f}{~Ev~UV&Ro~Onj129L zM(l?t9Y+bi!XAWg9SK@76=-H#u>#Mrb+-P5Q?U+Za>R0-J%;^jD)$Q(s9g!8u|2RT z1vyQeu0m*qf>~!nq^q*`&ZtS6tog4fD^`t(U<A#s7&N&&pt~dpyWDWf<p~`xS$Ct! zXaP;VQUkNDSdB1AdV<MU5O>dF!L@6yW$YY%-j+K@;l=7+9Dz@&|8{aYJwH5^PL0DV zzZVDKNB&v-7##HM@fY0_*)v8`&*T%MdeITjj*l2R40w78YssU+$DTvDdF{66Q!03q zQ`b3l!S`O*B6G>H<aqbd%glQ1{u|r@xajM}FT-tL&EYoY^LnPQjky**(DwlIMKs*^ zAd@WTYiDF#P5X|$&X6mLOl*8)Qn{;ZonkKzn`lhgop)*8k4%cNaPBH}im!oR{^tLP zUz3nu5@OSu<R8X?{|E__N*q_iS4v;Zu%1ASHN0dnp0Z%jf*}G$dL&^Kt0q%g{sm(k zx&s}Kr-?eZ39km;7B^TFx^E+jyz=>}vr}&hn{}Y5XUpo~j#_~C)#dw3?CNc`A(2Q) zia<q3K}x0hj7;p(^pQNmGb9DebeF7@UAxiHeuSPOs{&P^P1?jSp&Xubo75P4mkU{H zxbku^sp{DF3)x|6)DB~=nL#Er$o`pr6r<zQ>^(hQ54X3r|7CSB<|xwBsR^T#%#CUS zMc%q*x;CmOv+1l+TBcJOy;MKD%#2;;qBEzb$sZ_{%^0UG_eKIaE6Fes!)FEK^h`3L z8M-koO{C$ipl|SuMS7gTEc)Fo|61R;xc5?QDR#O0gP!G{pX(3JyDrcdp138c3nzY% zBDdtgO*yhIM;22z<d&UP;wL#udeP9f;o9y6tOga2Cti_(fp{FQ2V3`zkj;#o1=gQz z8QDFvk7ro5wZY0f7lr1KD)pb*V!Lpay46bs2)1!mDh!5}@GSfjQt>(P*LDe~F;?#& I3+-V40!2$hhX4Qo delta 1175 zcmah{O>7%Q6rNeHy@~BvuYVGI6DQfyrnXz^H0>dgs;H1aY1Jr3A|RDu%w}hkI&r;a zcb$@ItyC%nDk56+BoG&*a;ehh0L=|9lnSH@ai$GDAypvY&^8jBDlxOMt4bVrt9kS0 zz4v|d-rM>8&~KyUM?%7g$;k_U&M$pM#sz#FUKR%7ec^JN@IXsC*dAbO>kA2rfeVBf z!aOpBat}gH0^bG(M#y!%oonM&)gvDZt632><tA|>Ee_<#?Hr2FGG{a961dsDJ46MF zy%>y(hltW5&a<$>iLnCL#KD-NG5{mp!${*SvVzlaDJ034+JN3RU_@!(VhdEPW6EKD z43=mrb>d0qA{2S3()pw+sTrp%3U3AP2jVLUI2zi4ldupv%=BgH0Ne}dfs~hm=cM6* zlzZ?AuA_a=qJWTtSND26|5#^=m+Eye#IMpzIJvQ><1X$?&?HT*cU|X0WP*{)vwT?? zhaKr2_&gkk^WlE@DJ<h7aHS_HiL{%h*E8^UxS*0VY}}Zwrt-8^P&Y;+YZ(5BPU2lK zLjHkKc_;3IH{>_*Bzz-31CQiMc0L@-z=_x}CL15dz7}9E@gi=(dO{r)#GCzMNf5uw z?<+~-t-Mx>ibktQzdHUr{6Bw0MCeoGVSCLJoU0p;6O%Z+j68vzv2zt3C(grPsoUGG z+brz|=GuFsyMlwuh<&h>p289MK3y6rNVdXQHzTL5hHaR2SD!aGLsQnNS=+Q<=aImy zZf^$9RH=K?UVyR8NazG}J3qtO%tz8g3H1&=j6#okG1{_`ocb&R18P6qQQuqfoeu&? z-Sxq1c9H>&*3)F>w)hRPepo}xxF9s{GqdU#7Ohn4)O<%9(;TxlSEO?@?L9}$x^=2r z*WIdBuNZTBuB?rXX}M#sOq5>8m5V;ExTMz_=87}3zZ}+D!a8wgp5iVS9n-Ctblx<q znq}v6vo+mV%oQ|kr#4|VYG%XMsHxR-ZPv1B!#4kisaCC<{-E*)7zdYUIn}L;r}e7i z{D)1OT0;fw&)?xwfg8Pp%G=CvB&N=x2T{~XU^v?yjZU>?dKzBM4)3e51l#7S!IjGu zpROI}io<;sWrkCLFSD7{(7`R~c^u4a9TmEQ(|ButC`jO!>=o=nvoC|+g-`k>Vv87) JM~G{m?Oy`3BSZiI diff --git a/utils/utils_graph.py b/utils/utils_graph.py index c692e33..6626376 100644 --- a/utils/utils_graph.py +++ b/utils/utils_graph.py @@ -73,6 +73,8 @@ class plot_graph() : self.ax.set_ylabel(ylabel) self.ax.set_title(title, pad=30, color='black', fontsize=16) + self.ax.set_xlim(0, max(self.x)*1.15) + self.ax.grid(axis='x', linestyle='-', alpha=0.2) plt.tight_layout() @@ -112,10 +114,12 @@ class plot_graph() : return self.fig - def encadrer(self) : + def encadrer(self, selection) : - """iscod_index = self.df[self.df['denomination_cfa'] == 'ISCOD'].index.values[0] - bars[iscod_index].set_edgecolor('black') # Couleur de la bordure - bars[iscod_index].set_linewidth(2) # Épaisseur de la bordure """ + if selection : + for bar, label in zip(self.bars,self.y): + if label in selection: + bar.set_edgecolor('#FCA616') + bar.set_linewidth(3) - pass \ No newline at end of file + return self.fig \ No newline at end of file diff --git a/utils/utils_hist.py b/utils/utils_hist.py new file mode 100644 index 0000000..de482ec --- /dev/null +++ b/utils/utils_hist.py @@ -0,0 +1,21 @@ +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd +from matplotlib.colors import LinearSegmentedColormap, ListedColormap +import matplotlib.patches as mpatches + +# partie sur les légendes à revoir + +c_map = ['#000091', '#AB0345'] +cmap = LinearSegmentedColormap.from_list("custom_cmap", c_map) + +class plot_graph() : + def __init__(self,df, x, y, figsize = (10,6), ax = None, fig = None): + self.df = df + self.x = self.df[x] + self.y = self.df[y] + self.figsize = figsize + self.ax = ax + self.fig = fig + + \ No newline at end of file -- GitLab