From 5976329dea718db52f55acd7acadc76b72847182 Mon Sep 17 00:00:00 2001 From: Marilyne HU <marilyne.hu@student-cs.fr> Date: Tue, 1 Apr 2025 22:17:03 +0200 Subject: [PATCH] update new fonctionnality --- data/data_generate.ipynb | 185 ++++++++++++++++++ onglets/__pycache__/onglet1.cpython-310.pyc | Bin 0 -> 4375 bytes onglets/onglet1.py | 72 ++++--- requirements.txt | 3 +- utils/__pycache__/utils_graph.cpython-310.pyc | Bin 0 -> 4633 bytes utils/test_notebook.ipynb | 65 ++++-- utils/utils_graph.py | 4 +- 7 files changed, 285 insertions(+), 44 deletions(-) create mode 100644 data/data_generate.ipynb create mode 100644 onglets/__pycache__/onglet1.cpython-310.pyc create mode 100644 utils/__pycache__/utils_graph.cpython-310.pyc diff --git a/data/data_generate.ipynb b/data/data_generate.ipynb new file mode 100644 index 0000000..b04aa65 --- /dev/null +++ b/data/data_generate.ipynb @@ -0,0 +1,185 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_excel('df_cfa_anonyme.xlsx')" + ] + }, + { + "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>...</th>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " <td>...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>95</th>\n", + " <td>CFA_96</td>\n", + " <td>58</td>\n", + " <td>0</td>\n", + " <td>couleur 1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>96</th>\n", + " <td>CFA_97</td>\n", + " <td>23</td>\n", + " <td>3</td>\n", + " <td>couleur 4</td>\n", + " </tr>\n", + " <tr>\n", + " <th>97</th>\n", + " <td>CFA_98</td>\n", + " <td>79</td>\n", + " <td>1</td>\n", + " <td>couleur 2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>98</th>\n", + " <td>CFA_99</td>\n", + " <td>13</td>\n", + " <td>1</td>\n", + " <td>couleur 2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>99</th>\n", + " <td>CFA_100</td>\n", + " <td>85</td>\n", + " <td>4</td>\n", + " <td>couleur 5</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>100 rows × 4 columns</p>\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", + ".. ... ... ... ...\n", + "95 CFA_96 58 0 couleur 1\n", + "96 CFA_97 23 3 couleur 4\n", + "97 CFA_98 79 1 couleur 2\n", + "98 CFA_99 13 1 couleur 2\n", + "99 CFA_100 85 4 couleur 5\n", + "\n", + "[100 rows x 4 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "streamlit_env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.16" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/onglets/__pycache__/onglet1.cpython-310.pyc b/onglets/__pycache__/onglet1.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9bd989ac0fdb9feee714f825b600bd2293095e0 GIT binary patch literal 4375 zcmaJ^+i%;}87C=9qVATR_!h@uoHU8tL~XLW*EUVv%QB?hfOIKpcn~O^W0?*`s^^fg zBv4xiZ!g1)1lYrdZC&k$VatE8*TVnB!Jf9K00p)^3>dlr-R~Sqjxx9v!NZT|e7E!a zE{6(ArMxD8sZZO#SkSb;sh5c%2l`dqyoZ5kMEA4}T|JGB6rP4>cG4SZU9P3POeedM zRkZF|8<yhBZRDu6lRqfX9LAy=OKL3B%Arn7l0Hlw>WBJBZmLt=sDjRr>`%3gX`<iN zYSt52*WRh=A`=FUZQ28seXSo-e*1d^qh1&3D0DsEl3e58MG$gt>$v%^O-&261D(Lm zP>bPhq(3s)cVcbF80xWpkRryR&d!GBK|0pJV}LtD;FqrXi)!6G)cIvarNMavoY@J^ zjN(i~$|6}wgUS(WMCD`Spg?lTF0oQ1`O!*=6b|)=Hxz%F6k}tjLP`tTZ#7a@bVboq zAHn8`r#jXdPJyGkr;vlrGMOH)U|!MhVV@?hy%cs~UDx>DF0{z&ecZ~A87VWiN>1H3 z*<q;d%#hQh5}t~UJ)Pu8h0Kz<{md{W?H!yx)P^QxXUTkQ9vVZr=UK9#=nUvNvIzXL zah81oP4naoSt4imjiKcmL>pS+!p<V}oFQ7AB9(dVXP6}zw~PfXPRALtyq_B8pr=aC z9qOCLFh4BB`G;4fzdLipCg+v5Vq9eZRQgxQ1vOJr`b)}#i}0Wvmmld&#&MQBr@X5u zj><Er<gROvbY7XnB`!R?HnMh!TvocL;wk8=DSKB)P0dx6wyLtX3VYM>G<epOz2}v^ z8O1Skg1xsU?I{gcq2W|~3OOk?&XQ|N!|B2A<J`_te45l_D=x)V^1?o94RdFQv#vIr zYiq-K+zXH?lNVL|m*d$z{dMh!TflB{cqTj-pV`xgOW+tIdUm)RpM5x^GQcL+<3&=L zL&kk%#7l_hxfA^Tc+%f^`Qe<xXP(@6Doef+FG?K>8~X$upFE?(J~)2}<k?^1`Gb|% zR#~_J3b}**or`Vq)!!NMT)g-axIWlTP>AQr*W!f{5_R(ReQS6gD;MIKxI(_MZ>Swz zjL%CQ?`i%uQwyJaWb~(WZMdRqg90$PM827<zK^UMuKZ}lUre66`mV%v=~(->_RTNW zPS(Q9d)fmH@%nCfWltMkh|llT;tS;4<R$Vld1c?kE-oCbl9IHBym_A7#OkZ$7I{ss z5$*2rU0Z)Ax+WXdw!_+#*$)D4lfd_n9#d{p-`)yX#|iCvi$Ab~$gcN1-m4Ex`5v8z z+?#G|+lAcv-FtRR>Nt9AI}d2f=25G4^e0{)q?HUrAR1km5P755qTb0u(VLPlF-@qw zH8SD{KJ<3G0Sk{F*X?^Way^d@5*=_N@{b*rr1CXdf~tEij~vhCPUu1f!PbuVxb`Fs zhG-eXZ9mzq<lzysy=VBMB3S<M@h^XF-|A9!^v7sWU0r?M?NFaXfZJ=Ut2Wc6t^x+z zbK5@TkA7u8k&}a*-3mMaOZi}Nb#;A2+r;JFz;~O{7Bob2;9XsPx8Iev>4clBtApzL zcHs7GayjU#eb{SHq)%#x?*yGD13x`Bd|*3U5;)2R#&e{W7P*e=Hy$`%L_s>e5t&YA zOdis%$Rq#^R-`5F0s?33wn7cOG-BMo(yK+6VEPN#S`OmV4w#EgT<O;atM`Hkak};( zh`8OMVF*tVpwN|s6WML%bhq6PB5L0pEWhDnb^!24>tu3$O%x#I(T3}HqYwvi>OSq) zQo<lxLhlK^|HP1BUzs%M2b~U*!@KPCBtYDDn!M$54(g^T^*pCZy+#WgZqdP|r`92+ z;5<QWO%z9B%8kMF+sU4QR)P@raSjnt@+Tv>7S-VBm%16S<0OTj{YgKg%Mkt&S0_Z_ z>qs>5b#Ck{wYx#YTGS7nwgmp-$qr92AwyNKnDqKMnn*mvocc0pDUt>Omzi=idj5;^ z#E&{hkD2T^PbJ<&re<WRFfL5K9qfv<inz!mkc&*Ro#;jA{XS(JHT7(1AKRuO6!T-h z;Qqi`PaLx&`E7Y;?6JstRQlei86vHWi?qT!vL@JS7L(;E3L|DTlu#6td`zZ9d9>vE z1nI;XzG^kLD2Fq0n8yGUg$Yna2Dqbiqqnj4*WVoc{m&2Wb)=I-MD+{Xr#7b@bO^ia zaLoE4^--E~YbOCHQ_#g?y=I<dUYJdXZHrXbZ@c)e(ImX>?XZ?&vX_Vy>AIrOYz94) z7@7x<&S4sD?+^C7M~@L=)#PP4(WhlQsCELsaa_f9=pN+U4)W>+knlrxS78z-bVP2; zMfv(phYGWU?peDk48T}Y(^1z89735e6@!J4@Lf0D7Dkr{i&2L(aPWw%JX|Q}BCn>X zJV->EG8QnA*#;Lhq<5Jc!iIbmIUY4f^A_!O9b_pJR>xuYNwDjSG~af*;8g+50{5un zbCDsTY{Q}ml$(?#Ek~q0>dQX@iZ{opM_VD#5*EN}-Ir88q`h#&T~L1w5@<voy9-Bj z$_rYeC_~YJZ*l=?g?ws^Qa?vwl`<!!Om;L;RP&9l+qy3|$3y0#T|3<_AQE}U_k&O! zZX(m|D{VP>ysC3TWOp6ryM9|_VASzAOG%Acj&pj;ZKKL4y)P;f35kBA8HHis*Di`e z5{`xpjj-e>qrxgm+HW>I*Qe}d`6g?o(MulvaY-aCRpp>4bOM4dt5QVdB{$kDvR+gq zJy{M`Z`6xb*@#lYH<}Zfk(kvVbIH0A(-RuT3oCM=G^)qM7m<_Ja3fC&>cJbV-E>5$ z74b0WjKLpEsTRPQ{LT@&D@?_k!#}{04ih@A3pw5pMHL$4r_`<zp2<IfLZ>3{cG^I7 zYm2hS8v6jVpWRts+x!7X_u51fx?bO>_3dc$^`M2I`yt<a>-M{MZoSr6zq^S@Q>Wv( z;k7Occ4)X6_-&7ZC3#-2cl#nMzal)RUxI4>DTchBH!`VwDz6vyQ-&Ntr=~C#^^1C5 z2c?(wrT^r!W!=;bTp2au`B^?+G{A3|;4+O%M%l<1l1sipE96YW_;C4OnNk^2|38~A zWwJ%xFiwHfgbov$rVI;G8GT+~{ybyY7^P>@1M@>OC9O|hnSYlHWys9x)`!OD)9Ere zi_kWWCoGS6^Z(U;Vt%Uq*sL&)4cBH+<71@QRm`9eQ05M2@|+M=e8kGK@Z4rS34Bsk zh8rZ+km7wVi~wg&*9o_oY{nvs4+Z%q%$>mXCCV&mOAS>LjfSYI@~%%5IeP<=$|V)( hiGfL#)=MY^9F4EYZ$dte!O|>*r>I-Ft{8wm^*;{lE?EEo literal 0 HcmV?d00001 diff --git a/onglets/onglet1.py b/onglets/onglet1.py index 199e248..5094413 100644 --- a/onglets/onglet1.py +++ b/onglets/onglet1.py @@ -36,7 +36,7 @@ def display() : # bloc sur les infos du dataframe st.subheader('Information sur les données :') - with st.expander("📊 Aperçu du DataFrame"): + with st.expander("📊 Aperçu"): st.markdown(f"**Dimensions :** {df.shape[0]} lignes × {df.shape[1]} colonnes") st.markdown("**Colonnes disponibles :**") st.write(list(df.columns)) @@ -66,25 +66,43 @@ def display() : else: title = None - x_choice = st.checkbox("Voulez-vous nommer l'axe des abscisses ?") - if x_choice: - xlabel = st.text_input("Entrez le nom de l'axe des abscisses :", key="xlabel_input") - else: - xlabel = None + model_graph = utils_graph.plot_graph(df = df.loc[:nb_line-1, :], x = col_x, y = col_y) - y_choice = st.checkbox("Voulez-vous nommer l'axe des ordonnées ?") - if y_choice: - ylabel = st.text_input("Entrez le nom de l'axe des ordonnées :", key="ylabel_input") - else: - ylabel = None + col_nombre, col_pourcentage = st.columns(2) + + with col_nombre : + x_choice = st.checkbox("Voulez-vous nommer l'axe des abscisses ?", key = "xlabel_choice") + if x_choice: + xlabel = st.text_input("Entrez le nom de l'axe des abscisses :", key="xlabel_input") + else: + xlabel = None + + nombre_choice = st.checkbox('Mettre la valeur ?') + if nombre_choice : + nombre = st.selectbox('Nom de la colonne des valeurs :', columns) + else : + nombre = None + + with col_pourcentage : + y_choice = st.checkbox("Voulez-vous nommer l'axe des ordonnées ?", key = "ylabel_choice") + if y_choice: + ylabel = st.text_input("Entrez le nom de l'axe des ordonnées :", key="ylabel_input") + else: + ylabel = None + + pourcentage_choice = st.checkbox('Mettre le pourcentage ?') + if pourcentage_choice : + pourcentage = st.selectbox('Nom de la colonne des pourcentages :', columns) + else : + pourcentage = None - model_graph = utils_graph.plot_graph(df = df.loc[:nb_line-1, :], x = col_x, y = col_y) legend_choice = st.checkbox('Voulez-vous mettre une légende de couleurs ?') #annotation = st.checkbox('Voulez-cous mettre une annotation ?') #if annotation : # col_nombre = st.selectbox('Colonne des valeurs absolues', columns) + if legend_choice: col_color = st.selectbox('Choisir la colonne des numéros de couleurs', columns) @@ -120,9 +138,12 @@ def display() : legend_indices=legend_indices, title= title, xlabel= xlabel, - ylabel= ylabel + ylabel= ylabel, + show = False ) + model_graph.annotation(pourcentage= pourcentage, Nombre= nombre) + st.pyplot(barh) except Exception as e: @@ -130,18 +151,17 @@ def display() : else: # Tracer sans légende - barh = model_graph.barh_subplot(title= title, xlabel= xlabel, ylabel= ylabel) + barh = model_graph.barh_subplot(title= title, xlabel= xlabel, ylabel= ylabel, show=False) + model_graph.annotation(pourcentage= pourcentage, Nombre= nombre) st.pyplot(barh) - # Sauvegarde du graphique dans un buffer en mémoire - img_buffer = BytesIO() - barh.savefig(img_buffer, format='png', dpi=300, bbox_inches='tight') - img_buffer.seek(0) # Revenir au début du buffer - - # Bouton de téléchargement - st.download_button( - label="📥 Télécharger le graphique", - data=img_buffer, - file_name="mon_graphique.png", - mime="image/png" - ) + if 'barh' in locals(): + img_buffer = BytesIO() + barh.savefig(img_buffer, format='png', dpi=300, bbox_inches='tight') + img_buffer.seek(0) + + st.download_button( + label="📥 Télécharger le graphique", + data=img_buffer, + file_name="mon_graphique.png", + mime="image/png") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 97b1fd3..1b99619 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,4 +21,5 @@ streamlit==1.40.0 tqdm==4.66.5 openpyxl==3.1.5 geopandas==1.0.1 -mapclassify==2.8.1 \ No newline at end of file +mapclassify==2.8.1 +io \ No newline at end of file diff --git a/utils/__pycache__/utils_graph.cpython-310.pyc b/utils/__pycache__/utils_graph.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63abfce67c2c90dd65a0a4bfb86dba9a96137556 GIT binary patch literal 4633 zcmb6dTZ|k>vAgH7vyXe9@0G;a#CGmBAs6QbBC(yvSxGEe7o;;ttnV1+wr6)|GdsKP zo;}}QW<}r(1fdgw9~2PM-50tqK9TYl@&)1>r2Yeh&?!F%fdrPKP}Q^RTRXNA&uVI_ zs~`2~>Z<B(jf~_7JU{#I$F*pVkiTJL_%WgJGQ9Fz065_^BxS0<tZ9@@n$oPY4Kx;J znoikiX3N<=J=e^a3xFHktg-Tl@9d9q%O5#l<+0ZZw|V9U;h9}l9_Mt8l$;~rK~_sl z&0Y>7-xF(ot?5Ux&sSPuOEkT<8oeCIq4rMZ)LD4G`ZOS~yn6Q8=bl&jN=L@6rdxsG z6<lxlF`)4>yz&JAzSgA7cmd_RLCZ##!OzMvKB8r#Ws{F`hi9SB;yIqbK|oIil8&id zJ8Z>nO?d74Av;1F9@zj^D;a=;2XO}P3cT_;00~WqOA^u`37dzn3vIv+jkClAiji0V z&BO+1ak54Z>1xSVj8_%iR<x@!)u1MW9bYkTTN%(OWt1uXuqsdrkw;KKFoIwd!5Dx; zA|~K-b9Lo~^{-1`$n~Ztg0LI;%k|Fs#a5+*rk3lkU%GPnl~>)BwRIT_-)n|J{A63S z8h*UqiGxt4Fx7my-Bph322l{ZF0zxz*ro;e+3?HJovC9xEe}Rssh~iEXC4rg9QQ{4 z0br7O7mU)NTSS~kEXmB129xJG<?IF-P%e^P+8c|FWNepmW0v&BV>7n)ZEkWS89y*~ z>AS?u{E$>Bw_u)g+q?<b-#gcujPgl_lMWGYaNy!*l1y)clinoEbdWBu0G3U$Brn`J z*T@5<z%zSvoxzMOyvWCCi~t;kcPyDmCb_d`LeF^Ohz~UfDn6`{-c&rnvpjdZM!Qt} zIGNg?jHepYJP)2Z!bkUv14>C!(6aqJJ`vBvvx&1y@z*OPg^Oh4WN$i|j%R^mW|zK2 z#BZ^MV>I4h4||hoa5V=ZAKPQN?zQ)U?lk6-DL$TL`NW<9ylg%RcK9Rq?9bN-j*D_Y zB^@gMlu{F0OJ(Vif6=ssTO+}7VdTdtHL-A{#ve#DPmMpAXuS|`Jd{vA#i#iRKC=fg zB^h~-iVMl;dsJSCPr``tT?$&BU1z-$y_sZY|KS7DLv2Z;n4CyPs&JTkb9$vmzy}^p zW)CRLEhV#jcA7+#n=t3p0RedWfbh8o$Sg_b_&i_W5AX;1LwgxY-lNwF(f5(3cpLf4 zx4!`A(R*;N-Y4fv(HolcM_TibhB%+Qht8VwF9}EM3|Rpv5C6)%i!FY0pA!8*Tk{Mr z@<;fi{1kdcoZElwfWYqLz(#+D)}n5i(E2N!g{8#gr}-KF7><S6S%{O1s}(vp=kUc? zXu-P%uUr67gBZAx?a`R*(}W&S$rAcgb`3(T4pxUuu{Kv`AR`a)<+F-bbWaK<VF{Hx z7eY>`w3_V;58}GWWP$8FF%)<<JyCaMXA?=w=fYOS3*`ks2J?<kNP*z4;!feRrvYej zM~}r7c}^lY+YJzVo}_}8sLF;xtsX;e=#~s|0+*fvpz_GitzasXhfF}WC5lFeRE*;g z49)@-5@?u*;nkX)zPm`;f+t~+7Ab#+NR;=jSYkKXQ%|jmX<QeF-(ft>>yZJklcYp- z)_@FbX*rcu_u@+ZGgiT>K;ru-fbZfa7LG+|7vMBQy!;0E$~A^5Ok`nLD#R>eTGv|& ztL(X&ANkvDap4(U6BlRi6v@uxpTC8Ji2}D?peCwtDdK@_x1wM(^h<`yR=tX^wGpSV z-wM4=KP)lv7*1J4lDX;27=~u*Uc^IRDg%5(S#c1D{%c2QH)U;xUgfPL+$tDov^_3R zcjZ)DkToG4|D&}2li&Sk>7Oqhp#v(rf`yAvX6RRAWuh}2p%o5I#kM@f>Yko2&I0Ww zD=ytMif2kXdEcZ@)_(CmKEHnnSef2-Akn2Fkg*&3%JRZ?-3$H=?usIUr@?j^yd9|g z=4NXfvT>#E%Th^~11bZWcbbt@mfvj0U1c<(YA~@lQY>mK2iBEsFpzi%1Uar2K*KOr zPXEkE?G<1qI7ex1fmMcXgRQ)%t8A~`_9L#GW*Z#_OlW-#5zrr;URlD6YCf3NkCYwy zuxnh6Nk4YC<Dl}E-Vm7*x<iDV9-(`c#=9w=MY`S`mGvX2TZ9+;Dq92U^?=89@wk>Q z_P2pE#*Ro?*x6M%{M3Ck8tzHJRY6<O4ZUuw12kE0T~`_DZTVPO&8J8630%(JPMO<% zAxu!TuJXh3=7+Vh(}NDDUaRYBI{-IuDK{mFO<Z@R+7cDtjr{8_uvDY{;Q=^t1<aUl zw>r=t#U9wtUTrlug|7-*UKsFxC{dXx#h~=nvBiaLlIY9nMvV1W^g~})c*+R)w!i?R z3>c}b)Mo2INDpQaF&$b9!+{e6nfxArIeQxFyJ<Q{XPComYQk^Mn4t@-z*5X%<J4gb z^dx2POv0E^>cEV_x4>|AflUH+oGwF^nERA{Qn2sVUh4Nx8o-G;)P|L9wljN=$WXx| za`0gFjfLe3ymAMQOG3qq36n3zSb;<F1SQ2Xq*tS7Cgwhak^(C4hS4w+BcVF6Lk-@r z8g`u7cd&?&XA+B3T~I)+zMqAH!rae6L1E~E0!vQ|FAh-fK|ygX3$ycUQ0a@UgvzZi zz?I#V>$mTV>&07KKLC9{7~=ZEJ#^Jvp>RNXhqMPu4oZnTZSd>+lIA<9G^PBicpA1r z=U9PJUObBc??mEx1Ybt*6$E%S6E6ZN6+{{F%LuL_&=(v$+-acFF8ew*HxS?rRk#T7 zdQr-xhc`k(3jw;k*g|j}!Lh?1XQG@JMXlJ2gI0v|Bt~ba@2Fn_M|D26C!Bw!j@obM zod02aiT2yZ&WR!CJYMg%916||$+7R6nD6xcmv#OQXdo*s4pE%@+r{%myx1-C>eaz_ zk^51r8AMt}w^H>MH;U)a7Z)$Bt-N`0absD}TZZ`1@#WRC8@Xct!I*G$Xz7h*45B`- zrKxdgQRlbCQn7fdxYFu`en%9!UkttCW=rsn@IPlI%uhOyEIk8jq|d41M?Y$Nfs~(F zthhQ9YVN2896zc+cJ;-(U<_RYnf7hh$U#38SNh7mS{hv)JXfv&R$}mG@Mao$P2Y7@ z&UKqD4oU%DaNTPiFHCy`mUdzrK^MUef@67ZIflTh74NnZ<Dx@y6rvi%U+$CKHwz28 zzcisN$VTn1K%Z0-O)o}I2!l<yCnKip^eZl5zuksn!;`u|ylrqA#RZlT0^^yQ9A2p( z)ieD(E8fHrR>j4Po~;V_=L0j1cnxQx)OS-yIp<P)TtFw3SkyQK0yKnUfM$VCvi}30 CAf0po literal 0 HcmV?d00001 diff --git a/utils/test_notebook.ipynb b/utils/test_notebook.ipynb index 47eb8a7..e8bc3ca 100644 --- a/utils/test_notebook.ipynb +++ b/utils/test_notebook.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -15,7 +15,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -25,11 +25,38 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "model = plot_graph(df = df, x = 'count', y = 'denomination_cfa')" + "import matplotlib.pyplot as plt\n", + "\n", + "categories = ['A', 'B', 'C']\n", + "valeurs = [10, 20, 15]\n", + "pourcentages = [25, 50, 25]\n", + "\n", + "fig, ax = plt.subplots()\n", + "bars = ax.barh(categories, valeurs)\n", + "\n", + "# Annotations\n", + "for i, bar in enumerate(bars):\n", + " width = bar.get_width()\n", + " ax.text(width + 0.5, bar.get_y() + bar.get_height() / 2,\n", + " f\"{valeurs[i]} ({pourcentages[i]}%)\",\n", + " va='center', ha='left', color='black', fontsize=12)\n", + "\n", + "plt.show()\n" ] }, { @@ -39,7 +66,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/cAAAJOCAYAAADyNPfGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAMJJJREFUeJzt3X+U1XWd+PHXhRmGX/PDAYYRGUaSEI4raCyogFlKgkr+CEs7WnFytzTKbGvT9pzW2u/xuJu72y871imMTGrVyEpQC3+BGokkqBiLFCAIDCjCDIIzMDOf7x8d7jYyAzPDyPDWx+OcOcd77/vz+bxn3udzr0/ur1yWZVkAAAAAyerR3RMAAAAADo+4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMQVHOkDNjc3x+bNm6O4uDhyudyRPjwAAAActizLYteuXTFkyJDo0aP7nzc/4nG/efPmqKqqOtKHBQAAgC63cePGGDp0aHdP48jHfXFxcUREbNiwIUpLS4/04ekiWZZFbW1tlJaWegVGoqxh+qxh+qxh+qxh+qzh24N1TF+Ka1hXVxdVVVX5xu1uRzzu9y9USUlJlJSUHOnD00WyLIssy6KkpCSZk4+WrGH6rGH6rGH6rGH6rOHbg3VMX8preLTMt/vfGAAAAAAcFnEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkr6K4Dj/nabyNX1K+7Ds9hykUWx/WL2LQ7Iotcd0+HTrCG6bOG6bOG6bOG6ctFFstvmNzd0wA4bJ65BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAADjCnnjiiVi4cGF3TyMiInbu3Bm33nprNDY2dvdUgMNQ0N0TAACAo9nSpUtjxYoVsW3bthgxYkRcfvnlLW6fM2dOvPzyy9Gjx/89b/a5z30uiouLW91ffX19LFmyJGbNmhUREdu3b4+HHnooNm7cGI2NjVFRURFTpkyJYcOG5bf5+te/HgUFBZHL5SIiory8PK6++upW99/Q0BDz5s2LDRs2xLBhw+LSSy+NXr16RUTEypUrY82aNXHJJZfkx5eVlUVVVVUsW7YsTj/99E78hYCjQafivqamJm666aZYsGBBbNq0KSoqKuKUU06J6667Ls4555yuniMAAHSb4uLieO973xtr166Nurq6VsdMmTKl3WH83HPPRXV1dfTt2zci/hr7I0aMiOnTp0efPn1i+fLl8bOf/Syuvfba/JiIiKuuuioqKysPuf9ly5ZFUVFRfPnLX4558+bFsmXLYuLEiVFfXx+LFy+OmTNnHrDN2LFj47777hP3kLAOvyx//fr1MW7cuHjkkUfilltuieeffz4efPDBeP/735//10cAAHi7GD16dIwaNapFaB+O1atXx/Dhw/OXjzvuuBg3blz069cvevToEePGjYtcLhdbt27t1P537NgR1dXV0aNHjxg+fHjs2LEjIiIWLlwYEydObPX3qKqqirq6unjllVc690sB3a7Dz9x/5jOfiVwuF0uXLo1+/frlrz/ppJPik5/8ZJdODgAAUrB48eJYtGhRlJWVxemnnx5jx45tc2xNTU1Mnjy5zdu3bt0ae/fujUGDBrW4fu7cudHc3ByDBw+Os88+O4YOHdrq9oMHD47169fHKaecEuvXr4/q6urYsGFD7NixIz74wQ+2uk3Pnj2jvLw8ampqDjgukIYOxf1rr70WDz74YNx0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2qVXr17x/ve/P8rLyyOXy8XQoUPj+OOPjw0bNkRExL59+2LlypVx9tlnR+/evWPAgAExYcKEWL58eZv7XL16dQwfPrzdc3jttddiw4YNMWnSpNi3b18ce+yxcfLJJ8eKFStaHb9jx46oqqqKgoKCOOGEE2LHjh0REfH73/8+Ro4cGQMHDjxgm7Kysujbt2+sX7++3fPqVNwXFRVFZWVlVFZWximnnBI33HBDbNy4MV555ZXO7A4AAAA6rLGxMTZt2hSDBw+OiIhXX301mpqaorKyMj+msrIytm7d2uY+ampqWg3s+fPnxze+8Y2YPXt2rFmzJn/91q1bo3///tGvX792HWPw4MGxYcOG2LdvX6xduzYqKiritddeiz/96U8xefLkNuc1aNCgqKmpafuXf5PDfs/966+/HnfeeWeMGDEiBgwYcMDtDQ0N0dDQkL9cV1d3uIcEAADgHS7LsvjNb34TAwYMiNGjR0dExN69e6OwsDB69Pi/57F79+7doknfrL6+PoqKilpcd8kll8SQIUMil8vFqlWr4u67746ZM2fGcccdF3v37o3evXu3GH+wY7z73e+OjRs3xo9+9KOoqKiI888/P37xi1/EtGnT4sUXX4ylS5dGYWFhnHvuuTFo0KD8dkVFRVFfX9/uv0ennrmfP39+9O/fP/r37x/FxcXxm9/8Ju66664Wf8D9br755igtLc3/VFVVdeaQAAAAEBF/DfsFCxbE9u3b47LLLsu/Z71Xr16xb9++aG5uzo9taGg4IN7/VmthXl1dHYWFhVFQUBAnn3xyjBw5MlatWpU/xpvHH+oYZ599dlxzzTUxY8aMePHFF6O0tDQqKiriwQcfjMsuuywmTZoUv/nNbw7Y55v/EeFgOhX373//+2PFihWxYsWKWLp0aUydOjXOO++8eOmllw4Y+5WvfCVqa2vzPxs3buzMIQEAACCyLIv7778/Nm3aFFdeeWWLAB44cGD07NmzxcvZa2pqoqKios39VVZWxquvvnrQY/7tB94NHjw4du3a1eKr6g51jP327NkTTz75ZHzgAx+I7du3R2lpafTp0yeGDh16wEvwX3nllRZvLziUTsV9v379YsSIETFixIgYP358/OhHP4rdu3fHD3/4wwPGFhUVRUlJSYsfAAAA6Iz7778/Nm7cGB/72MeiT58+LW4rLCyMk046KR599NGor6+P7du3x9KlS+M973lPm/sbOXJkiw+uq62tjZdeeikaGxujqakpXnjhhVi9enX+k/PLy8ujqqoqnnzyySgsLIyampp4/vnnW3wdX1sWLlwYZ555ZvTp0yfKyspi+/btUVdXF2vXro3y8vL8uJ07d8aePXuiurq63X+XLvme+1wuFz169Ig33nijK3YHAAAAB9i5c2csW7YsevbsGd/61rfy148ZMyb/DW7nn39+zJ8/P775zW9GQUFBTJgwoc2vwYuIGDt2bCxevDj27NkTffv2jb1798YDDzwQr732WvTo0SMGDBgQl156aQwdOjS/zYwZM+Lee++Nf/7nf4777rsvpkyZ0urX4P2t9evXx+uvvx4nn3xyRET0798/3vve98YPfvCDKCoqiosuuig/9tlnn42xY8dGr1692v236VTcNzQ05F8ysGPHjrj11lvj9ddfjw9+8IOd2R0AAAAcUllZWdx4440HHVNUVBQzZsxo9z579+4dp59+ev7l8oMGDYqrr776oNuUlJTEJZdcEqWlpVFbW9uuV6gff/zxB/wDwOmnnx6nn356i+saGhri2Wefjauuuqrdv0NEJ+P+wQcfjGOPPTYiIoqLi2PUqFFxzz33xPve977O7A4AAAC6zZlnntndU8grKiqKa6+9tsPbdTju58yZE3PmzOnwgQAAAIC3Rqc+UA8AAAA4eoh7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEhcQXcd+LmvTY3S0tLuOjyHKcuyqK2tjdLS0sjlct09HTrBGqbPGqbPGqbPGqbPGr49WMf07V9DOs8z9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkLiC7jrwmK/9NnJF/brr8BymXGRxXL+ITbsjssh193ToBGuYPmuYvlxksfyGyd09DQDgbcAz9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAO8QTzzxRCxcuLC7pxERETt37oxbb701Ghsbu3sqAPC2UNDdEwAADrR06dJYsWJFbNu2LUaMGBGXX355i9sbGhpi/vz58eKLL0ZhYWGMHz8+zjrrrDb3V19fH0uWLIlZs2ZFRMT27dvjoYceio0bN0ZjY2NUVFTElClTYtiwYfltvv71r0dBQUHkcrmIiCgvL4+rr7661f03NDTEvHnzYsOGDTFs2LC49NJLo1evXhERsXLlylizZk1ccskl+fFlZWVRVVUVy5Yti9NPP71zfyQAIK9Tcb9kyZKYPHlyTJs2LRYsWNDVcwKAd7zi4uJ473vfG2vXro26uroDbn/ggQfijTfeiC984Quxe/fuuOOOO6KsrCzGjh3b6v6ee+65qK6ujr59+0bEX2N/xIgRMX369OjTp08sX748fvazn8W1116bHxMRcdVVV0VlZeUh57ts2bIoKiqKL3/5yzFv3rxYtmxZTJw4Merr62Px4sUxc+bMA7YZO3Zs3HfffeIeALpAp16WP3v27Pjc5z4Xixcvjs2bN3f1nADgHW/06NExatSoFqG93759+2LlypVx9tlnR+/evWPAgAExYcKEWL58eZv7W716dQwfPjx/+bjjjotx48ZFv379okePHjFu3LjI5XKxdevWTs13x44dUV1dHT169Ijhw4fHjh07IiJi4cKFMXHixFZ/j6qqqqirq4tXXnmlU8cEAP5Ph+P+9ddfj7vuuiuuueaauOCCC2LOnDlvwbQAgLa8+uqr0dTU1OIZ9crKyoOGeU1NTQwcOLDN27du3Rp79+6NQYMGtbh+7ty5ccstt8Qdd9wRL7/8cpvbDx48ONavXx+NjY2xfv36qKioiA0bNsSOHTvilFNOaXWbnj17Rnl5edTU1LS5XwCgfToc93fffXeMGjUqTjzxxLjyyivj9ttvjyzL3oq5AQCt2Lt3bxQWFkaPHv/3MN67d+9oaGhoc5v6+vooKipq87Z58+bF5MmTo3///vnrP/7xj8fnP//5+PznPx8jRoyIn/70p1FbW9vqPk499dTo06dP/PCHP4w+ffrEmDFj4oEHHogLLrggnn766ZgzZ07cddddsWvXrhbbFRUVRX19fUd+fQCgFR2O+9mzZ8eVV14ZERHTpk2L2traWLRoUZvjGxoaoq6ursUPANB5vXr1in379kVzc3P+uoaGhjbjPaLt+K+vr48777wzqqqq4n3ve1+L24YPHx4FBQXRq1evmDhxYgwcODDWrFnT6v4LCgriggsuyL+y7w9/+EOMHj06mpub4+mnn44rr7wyTjzxxPjd737XYruGhobo3bt3B357AKA1HYr71atXx9KlS+OjH/1oRPz1gfyyyy6L2bNnt7nNzTffHKWlpfmfqqqqw5sxALzDDRw4MHr27Nni5ew1NTVRUVHR5jaVlZXx6quvtrhuf9gPGjQopk+fnv9U/LYc6vb9tm/fHqtXr45JkybF1q1bY/DgwVFQUBBDhw5tMeempqZ47bXX2vWBfQDAwXUo7mfPnh2NjY0xZMiQKCgoiIKCgrjtttti3rx5bb5M7ytf+UrU1tbmfzZu3NglEweAt7Pm5uZobGyM5ubmyLIsGhsbo6mpKSIiCgsL46STTopHH3006uvrY/v27bF06dJ4z3ve0+b+Ro4cGevXr89fbmhoiLlz58aAAQPiwgsvPCDct23bFps3b46mpqZobGyMp556Kl555ZU44YQTDjn3BQsWxLRp06Jnz55xzDHHxKZNm6K+vj7Wrl0b5eXl+XEbN26M4uLiA97nDwB0XLu/Cq+xsTHuuOOO+K//+q8499xzW9x28cUXx89//vNWv/u2qKjooC8TBAAOtHjx4hZve7vpppuiuro6/5Vy559/fsyfPz+++c1vRkFBQUyYMKHNr8GL+OvXzi1evDj27NkTffv2jVWrVsXLL78cW7dujVWrVuXHTZ8+PcaMGRO7d++O+++/P2pra6OgoCAqKiriiiuuiGOOOeag816xYkWUl5fHsGHDIuKvn8o/atSo+Pa3vx0lJSVx6aWX5sc+++yzMX78+M78eQCAN8ll7fw0vF/96ldx2WWXxbZt26K0tLTFbddff3088sgj8fTTTx9yP3V1dVFaWhrDrrsrckX9Ojdrul0usjiuX8Sm3RFZtO9lmhxdrGH6rGH6cpHF8hsmR2lpabtf8n44Hn/88aivr48PfOADb/mxDmXnzp0xd+7c+PSnPx0FBe1+ruGok2VZ1NbWHrE1pOtZw7cH65i+FNdwf9vW1tZGSUlJd0+n/S/Lnz17dkyZMuWAsI+ImDFjRixbtiyee+65Lp0cANB1zjzzzKMi7CMiysrKYtasWUmHPQAcTdr9iHrfffe1eduECRN8HR4AAAB0kw5/FR4AAABwdBH3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJE/cAAACQOHEPAAAAiRP3AAAAkDhxDwAAAIkT9wAAAJC4gu468HNfmxqlpaXddXgOU5ZlUVtbG6WlpZHL5bp7OnSCNUyfNUzf/jUEADhcnrkHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEiXsAAABInLgHAACAxIl7AAAASJy4BwAAgMSJewAAAEicuAcAAIDEFRzpA2ZZFhERdXV1kcvljvTh6SJZluXX0DqmyRqmzxqmzxqmzxqmzxq+PVjH9KW4hnV1dRHxf43b3Y543G/fvj0iIoYNG3akDw0AAABdateuXVFaWtrd0zjycV9eXh4RERs2bDgq/gB0Tl1dXVRVVcXGjRujpKSku6dDJ1jD9FnD9FnD9FnD9FnDtwfrmL4U1zDLsti1a1cMGTKku6cSEd0Q9z16/PVt/qWlpcksGm0rKSmxjomzhumzhumzhumzhumzhm8P1jF9qa3h0fSEtQ/UAwAAgMSJewAAAEjcEY/7oqKiuPHGG6OoqOhIH5ouZB3TZw3TZw3TZw3TZw3TZw3fHqxj+qzh4ctlR8vn9gMAAACd4mX5AAAAkDhxDwAAAIkT9wAAAJA4cQ8AAACJe0vi/nvf+14cf/zx0bt37zjttNNi6dKlBx1/zz33xKhRo6J3795x8sknx/333/9WTIt2uvnmm2P8+PFRXFwcFRUVcfHFF8fq1asPus2cOXMil8u1+Ondu/cRmjFv9rWvfe2A9Rg1atRBt3EeHl2OP/74A9Ywl8vFrFmzWh3vHOx+ixcvjg9+8IMxZMiQyOVy8atf/arF7VmWxb/+67/GscceG3369IkpU6bEmjVrDrnfjj6m0nkHW8N9+/bF9ddfHyeffHL069cvhgwZEh//+Mdj8+bNB91nZ+6POTyHOhdnzpx5wJpMmzbtkPt1Lh45h1rD1h4fc7lc3HLLLW3u07l45LSnJerr62PWrFkxYMCA6N+/f8yYMSO2bt160P129nH0naTL4/6uu+6Kf/qnf4obb7wxnnnmmRg7dmxMnTo1tm3b1ur43//+9/HRj340rrrqqli+fHlcfPHFcfHFF8fKlSu7emq006JFi2LWrFnxhz/8IRYuXBj79u2Lc889N3bv3n3Q7UpKSmLLli35n5deeukIzZjWnHTSSS3W44knnmhzrPPw6PP000+3WL+FCxdGRMSHP/zhNrdxDnav3bt3x9ixY+N73/teq7d/4xvfiO985zvx/e9/P5566qno169fTJ06Nerr69vcZ0cfUzk8B1vDPXv2xDPPPBNf/epX45lnnolf/vKXsXr16rjwwgsPud+O3B9z+A51LkZETJs2rcWa/PznPz/oPp2LR9ah1vBv127Lli1x++23Ry6XixkzZhx0v87FI6M9LfGFL3wh7rvvvrjnnnti0aJFsXnz5vjQhz500P125nH0HSfrYhMmTMhmzZqVv9zU1JQNGTIku/nmm1sd/5GPfCS74IILWlx32mmnZZ/+9Ke7emp00rZt27KIyBYtWtTmmB//+MdZaWnpkZsUB3XjjTdmY8eObfd45+HR7/Of/3x2wgknZM3Nza3e7hw8ukREdu+99+YvNzc3Z5WVldktt9ySv27nzp1ZUVFR9vOf/7zN/XT0MZWu8+Y1bM3SpUuziMheeumlNsd09P6YrtXaOn7iE5/ILrroog7tx7nYfdpzLl500UXZ2WeffdAxzsXu8+aW2LlzZ1ZYWJjdc889+TGrVq3KIiJbsmRJq/vo7OPoO02XPnO/d+/e+OMf/xhTpkzJX9ejR4+YMmVKLFmypNVtlixZ0mJ8RMTUqVPbHM+RV1tbGxER5eXlBx33+uuvR3V1dVRVVcVFF10UL7zwwpGYHm1Ys2ZNDBkyJN71rnfFFVdcERs2bGhzrPPw6LZ37964884745Of/GTkcrk2xzkHj17r1q2LmpqaFudZaWlpnHbaaW2eZ515TOXIqq2tjVwuF2VlZQcd15H7Y46Mxx57LCoqKuLEE0+Ma665JrZv397mWOfi0W3r1q2xYMGCuOqqqw451rnYPd7cEn/84x9j3759Lc6pUaNGxbBhw9o8pzrzOPpO1KVx/+qrr0ZTU1MMHjy4xfWDBw+OmpqaVrepqanp0HiOrObm5rjuuuti0qRJ8Xd/93dtjjvxxBPj9ttvj1//+tdx5513RnNzc0ycODFefvnlIzhb9jvttNNizpw58eCDD8Ztt90W69atizPPPDN27drV6njn4dHtV7/6VezcuTNmzpzZ5hjn4NFt/7nUkfOsM4+pHDn19fVx/fXXx0c/+tEoKSlpc1xH7495602bNi3uuOOOePjhh+M//uM/YtGiRXHeeedFU1NTq+Odi0e3n/zkJ1FcXHzIl3Q7F7tHay1RU1MTvXr1OuAfRg/VjPvHtHebd6KC7p4AR7dZs2bFypUrD/mepDPOOCPOOOOM/OWJEyfG6NGj4wc/+EH8v//3/97qafIm5513Xv6/x4wZE6eddlpUV1fH3Xff3a5/2eboMnv27DjvvPNiyJAhbY5xDsKRs2/fvvjIRz4SWZbFbbfddtCx7o+PPpdffnn+v08++eQYM2ZMnHDCCfHYY4/FOeec040zozNuv/32uOKKKw75IbLOxe7R3paga3TpM/cDBw6Mnj17HvBJh1u3bo3KyspWt6msrOzQeI6cz372szF//vx49NFHY+jQoR3atrCwME499dT485///BbNjo4oKyuLkSNHtrkezsOj10svvRQPPfRQ/MM//EOHtnMOHl32n0sdOc8685jKW29/2L/00kuxcOHCgz5r35pD3R9z5L3rXe+KgQMHtrkmzsWj1+OPPx6rV6/u8GNkhHPxSGirJSorK2Pv3r2xc+fOFuMP1Yz7x7R3m3eiLo37Xr16xbhx4+Lhhx/OX9fc3BwPP/xwi2eU/tYZZ5zRYnxExMKFC9scz1svy7L47Gc/G/fee2888sgjMXz48A7vo6mpKZ5//vk49thj34IZ0lGvv/56/OUvf2lzPZyHR68f//jHUVFRERdccEGHtnMOHl2GDx8elZWVLc6zurq6eOqpp9o8zzrzmMpba3/Yr1mzJh566KEYMGBAh/dxqPtjjryXX345tm/f3uaaOBePXrNnz45x48bF2LFjO7ytc/Gtc6iWGDduXBQWFrY4p1avXh0bNmxo85zqzOPoO1JXf0Lf//zP/2RFRUXZnDlzsj/96U/Zpz71qaysrCyrqanJsizLPvaxj2U33HBDfvyTTz6ZFRQUZP/5n/+ZrVq1KrvxxhuzwsLC7Pnnn+/qqdFO11xzTVZaWpo99thj2ZYtW/I/e/bsyY958zp+/etfz377299mf/nLX7I//vGP2eWXX5717t07e+GFF7rjV3jH++IXv5g99thj2bp167Inn3wymzJlSjZw4MBs27ZtWZY5D1PR1NSUDRs2LLv++usPuM05ePTZtWtXtnz58mz58uVZRGT//d//nS1fvjz/Ser//u//npWVlWW//vWvs+eeey676KKLsuHDh2dvvPFGfh9nn3129t3vfjd/+VCPqXStg63h3r17swsvvDAbOnRotmLFihaPjw0NDfl9vHkND3V/TNc72Dru2rUr+9KXvpQtWbIkW7duXfbQQw9l73nPe7J3v/vdWX19fX4fzsXudaj70yzLstra2qxv377Zbbfd1uo+nIvdpz0tcfXVV2fDhg3LHnnkkWzZsmXZGWeckZ1xxhkt9nPiiSdmv/zlL/OX2/M4+k7X5XGfZVn23e9+Nxs2bFjWq1evbMKECdkf/vCH/G1nnXVW9olPfKLF+LvvvjsbOXJk1qtXr+ykk07KFixY8FZMi3aKiFZ/fvzjH+fHvHkdr7vuuvyaDx48ODv//POzZ5555shPnizLsuyyyy7Ljj322KxXr17Zcccdl1122WXZn//85/ztzsM0/Pa3v80iIlu9evUBtzkHjz6PPvpoq/ed+9epubk5++pXv5oNHjw4Kyoqys4555wD1ra6ujq78cYbW1x3sMdUutbB1nDdunVtPj4++uij+X28eQ0PdX9M1zvYOu7Zsyc799xzs0GDBmWFhYVZdXV19o//+I8HRLpzsXsd6v40y7LsBz/4QdanT59s586dre7Dudh92tMSb7zxRvaZz3wmO+aYY7K+fftml1xySbZly5YD9vO327TncfSdLpdlWfbWvCYAAAAAOBK69D33AAAAwJEn7gEAACBx4h4AAAASJ+4BAAAgceIeAAAAEifuAQAAIHHiHgAAABIn7gEAACBx4h4AAAASJ+4BAAAgceIeAAAAEifuAQAAIHH/H+PhVgGo2dcjAAAAAElFTkSuQmCC", "text/plain": [ "<Figure size 1000x600 with 1 Axes>" ] @@ -49,20 +76,26 @@ } ], "source": [ - "graph = model.barh_subplot()" + "import pandas as pd\n", + "from utils_graph import plot_graph # ou mets ta classe directement ici\n", + "\n", + "df = pd.DataFrame({\n", + " 'catégories': ['A', 'B', 'C'],\n", + " 'valeurs': [10, 20, 15],\n", + " 'pourcentage': [25, 50, 25]\n", + "})\n", + "\n", + "graph = plot_graph(df, x='valeurs', y='catégories')\n", + "fig = graph.barh_subplot(show=False) # on désactive le plt.show dans la méthode\n", + "graph.annotation(Nombre='valeurs', pourcentage='pourcentage')\n", + "\n", + "plt.show() # c’est ici qu’on affiche tout à la fin" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { "kernelspec": { - "display_name": "base", + "display_name": "streamlit_env", "language": "python", "name": "python3" }, @@ -76,7 +109,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.7" + "version": "3.10.16" } }, "nbformat": 4, diff --git a/utils/utils_graph.py b/utils/utils_graph.py index 588399a..c692e33 100644 --- a/utils/utils_graph.py +++ b/utils/utils_graph.py @@ -21,7 +21,7 @@ class plot_graph() : def barh_subplot(self, title = None, xlabel = None, ylabel = None, path = None, yticklabels = None, xticklabels = None, colors = None, legend_list = None, title_legend = None, show = True, force_new_fig= True, - legend_indices=None): + legend_indices=None, pourcentage = None, Nombre = None): # couleurs des barres if colors in self.df.columns and not self.df[colors].empty: @@ -108,6 +108,8 @@ class plot_graph() : text = f'{self.df.loc[n,Nombre]} ({self.df.loc[n,pourcentage]} %)' self.ax.text(width * 1.01 if not np.isnan(width) else 0 , bar.get_y() + bar.get_height() / 2, text, va='center', ha='left', color='gray', fontsize=9) + + return self.fig def encadrer(self) : -- GitLab