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
zcmbVOdrTYm9l!Gfzs~PB_;J|03?&az0?C>Xnvj$PN?xS_npuv2XRvE*dN$$F^W3hQ
zWV%#9f1MK6wX~|Lrh-2*O<Sw2lcILgGHu$<vn$MrNl}Gb^`D6?*&=1CwBOkrcG^^{
zc9ws?@9+Ekd>_BlebsUEsOFDqwGu;*f7d@ob2UHL#BmjW7Nh^2m(?(X?-f_Q*!7E#
z@Hg>lpjcI|h<I%b!?7e@qA)CCfgg$;uv4stuZT@bVr5&>4&N7hj;a|^#387bcc8JO
z!|NE(ev4eUE!V#xg?q$i_<`62|0c2EE;uV0;7_=b=cDsoNx#`r_AF4qRJ5CyTAaG1
zPv9~l0Uodb9k8z2;K$O#X#}EGP$}=g4ys2*t2Kg2#8Z|DR7zUmTq<Y+&9lcajBaHl
zk==r3d1s`h^abq{UIkCe+(ri@VX9W0D}4FUlaj?OJYS9YLg7;~o^!}m!I4+AqOD|E
zxdQi27zLxCZAl!yAam>oB&c2W?6_6NL;y=ElO2L-q*I{EJ0pTO<)$M5W5hr=iw5OK
z$Oxb{B;vcp$QU{BB3a$66vINI)%q1l$vCB|!03TGx#RI?&?KdZl$s&hADpI#rO*hP
zDzIu8jgW>1_&{@oNLx%pTM?}d{$1{<O6eFKZRJaM@sWzs>5J-mJ_&#cwZJh({T(p1
zf?XAX4U9p+bPVhUdn!c6Vi02`rgBLI3hdqKl8G^upr+d@pqh(b%-?`2V&r`7Q<neX
zf8UOOD`Tat721yp7|J_%l(DRc4wo1yTQM{m96=%SupYJV1h6yq1)P4CueN`GMGDml
zj8R3p1TW>CsRkX4GObM;S36hG=<pBff+}*PNItNnYQk8`F^Z*}=<kB7V)wuSAu@U^
z9Tk+Bom+bhyZB2CE6$rcMJ9W8G)TcNRa=o;aXeK;bx+F6c-moys<sUrWZY=xk?rf)
z8zQDw7?xDsH#*`i4NvKoeXr6CJjS?r^NQi9|GIg)KGF*vN_W~BIVB)1?@Yab8P&)2
zP>r4Ij$`RMrXC#nnTT;PZobP`K9GEC2N)+f%(xgOqh*YsW3}t#io6sy)qon&Uxpx1
zX>(e?dPJy0v0Vd#th_U})o%VhoIYLV2^7;%P9`?+Eu&E!3k2xs&b#FQ!b9u?{f>aZ
zvE<W&&B``$8KX}ohrZ5DHKiLOBLcU)Gfkie90w;>pAev<A~i)WmNYbFMGONPzDC{O
zujG|z(2Lxh1gBQ}%1&l5{^!N^VhMaogkwYKvf$W)<jPN>hOml7S2nlzm(Xs<U*lK*
z<!SK{Hidh!<XIs~9Y(uTjTNJRUXYY`@OZgLL+B-$YWzXtm5)mM6h4KOy!!gzd5gep
z=Y2S5oJ>&uU_6!#gku!#p9+KI7<^Y<r{g=YwG3Y-yC*36llLa!=jxYWOj9fUlE3kA
zUbENANkh?iAjyftu_SUO3&(=dNkGAynmQFaOT#fhO;0w!U+b!0)yA8?R3pRDQ1SV^
z%O~MPAjIL*96rOzLgCRwc$WH-|6YM{ZL^kBPe%insHi_U77qt0xTM`bF#AY%C=?Ek
zQ8XD1ke35dYLX@cmlE;lBt-&>42}h!L)4`JO;cpotozCMIL}79!FV(ti}6Z{ZMy_{
z5dKBG3&ojvAkJ6XgXd;_<v0{M5uc=k6e`f@!-CX3JV=ERiZt5@^;+X$Dn<q_2VzNb
z5<%HUIZ2|7kD?qC;Y5O(C8G%8(c|6ZCvTBdEEoVZO7`F+|FMHynBhg84SuM51)kJ*
ziRH8#UeWLFs6|4W|J0$q{6eC|C*o8U5V$IY@)Av<rYI6rlnN%p@fiGr{#=cOeuy<E
zLEy&VenZ^ZfShp>5J(0%MJODl{IS3|#Yx7)<CJd?{Maz4RPe$Ojo7fx*eI1w(cvWQ
zH9l%omm>K=a%O@`&<5lQGR7l>YJ4)943~uPH^$xr%0Mg@PX>5QoLoqntD2aZh{ltg
zqGvitO%#Q)sQ?`d$40rTXgnB*CSZ%H;kb`eO(Mkr@bmaMIluBCY5p6Nlf^Fiqx@ta
z=TFMwyrOZBCO9>qLIH%tUz}3Nn4D?86r5^24$#<*(t(LFPKi|gv108wEl*b#RX)8v
zoW<gE>XP0zkE_}?lg|iRe0MlQg$F^<TtpggEoPbE4BIsrM?)v5Ji@D}qtqxB10^2(
z!qkcTAZczZHi_m(gu^LL86F??Uz!YsC_2G^M#JaKZuo*(DY`!bUp3e3PlS_Xv3%qN
z9gm<<fWI>DR{aoZYSBM&OA5ElEA_-2v2gbK`A_9-cdIakY95_gb9-LCe?zUEADJ7u
z=K56K1b=UtNc-+;b`*ShdGm(BbanUQ?gG(Vuvj-N_G=zES}+(3dPBizy{ncPl^NNV
z2{W3nHZL}>8N6A8H)p8N$ZnghYv%f_x&Hdphf;ReVb)xqGk2|-Ph`y}GRjSrCNulv
zu4`xhs&W+^-sS$K{_D**&b;5+l5=!s`Zr9Lt9^@oY;DiYDRwZJH-WjH%?e)5G?3}p
zgl}0pr6?b(2e#TgX?85aMiXpuDjS_*N2l|anT%?)q3ONI+mRdkcgC}FZ$`N=@R{1W
zVYOd<e(`zM+s{4)@>VMI#JbkHVXs+sE;-r80rsh2-VPS4Zrhy;Rhtgi@~Nd$Y|~)Q
z@pPttUF+Z#9ZL?j;lwR#&VFWF@18Y{X>9+j#x%|y_fN8eRNfkT(EVw45ajKY;J()T
zUd`JzZ0m(w?GQ`2*0r@8E^;}#6lGh^u;+$zu8~F6ZI@?3b<c`iZ#ht*7oJ-5Wn>#p
z_wvZn2<tnWbDm@6)$83V=Z39%S+k^J8+&hc<ZS2WdT-ktncll{3_(^cso1)6IotV+
z`ZJY{*Cdt*w*D-8ek5mmCeynmX@PIrT=;GHTid_Vg&J~8kJ<Lz!4x*bf@I5r=^bmj
zhODmP#;IEtR@ac%oi6BV)^v4QUETE=R#%tT9oW<vt|}H4*Xn+v-O^wt_nNUKYizmE
zezSo+dx7->*4UCWQki1~!n#IyvV`Y`>gFIzc=AMFkws<+^7;XmAoFRWeUs44_s;b$
zfGY#HRr=Qk;e{+p&`!Q?&zvj}y7|7jzH8Ojdu}9d$ufO;;&g$q%n!^BT<gvgE@Zn#
zxUz(+VCg8B-G%Dbf|>lcLZbF;sW8H|m6Bj`_q|=1#+Ow$-M@DhN3EM1zJHJJ-kksb
zy+JLGRlAl<_rI_^mrVb;+XjQxp7a#DPrtK2-ZW$v|B39b8)^{$S%bEH;;gHC-*7dS
z(>sSTX>OO2r#owh)zZA(hUk1-cNf~$?b0EyY`sA`v`4nSPdao+#$nQ7rGk^nk(5(Q
zhph_EP^7CBBO)>9H4h&WbBCme_8B>aEs><Dz<4yAq}ve^^g<29Kp;UMfTEg5@e8n{
z=0FGk1xWLE|9$KZS~2=Xv~cpr&^vH4N*$&b(Gf@g1pgJZCB||5P8Eh*;kz{hiiimJ
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