
    h/              
       d   S r SSKrSSKJr  SSKrSSKrSSKJ	r
  SSKrSSKJr  S S jr\S:X  Gav  \" \R$                  5      S	:  a  \" S
5        \R(                  " S5        \R$                  S   R+                  5       r\" S5      \-  \ S3-  r\R0                  r\R5                  5       (       d  \" S\ 35        \R(                  " S5        \" S\R7                  5        S35        \R8                  " \SS9rSS/r/ SQr\ V s/ s H  o \R@                  ;   d  M  U PM     sn r!\ V s/ s H  o \R@                  ;   d  M  U PM     sn r"\" S\! 35        \" S\" 35        \! H  r#\" S\# S35        \" \\#\\SSS9  M     \" H  r#\" S\# S35        \" \\#\\SSS9  M     \" S5        ggs  sn f s  sn f )!u  
Generate heatmaps for all key OSM road attributes (numeric and categorical).

Enhancements:
 - Automatically removes unused legend categories
 - Uses adaptive colormaps (Set2 → tab20 if >8 categories)
 - Prints unique values for diagnostics
 - Handles missing data gracefully
    N)Path)	colormapsinfernoFc                    U R                  5       n[        R                  " SS9u  pxUR                  R	                  S5        UR	                  S5        UR                  5        SUR                  5        3n	[        SU SU S35        [        Xa   R                  SS	95        U(       Ga8  Xa   R                  5       R                  5       n
[        U
5      S
:X  a&  [        SU S35        [        R                  " U5        g [        U
5      S:  a}  [        SU S35        Xa   R                  5       R                  S5      R                  nSUR                  Xa   R                  U5      ) U4'   Xa   R                  5       R                  5       n
[        U
5      S:  a  SnOSnUR!                  UUSSUSSSU[#        U
 Vs/ s H  n[%        U5      PM     sn5      S.SSSS.S9  O[&        R(                  " Xa   SS9Xa'   Xa   R                  5       R*                  (       a&  [        S U S35        [        R                  " U5        g [,        R.                  " Xa   R                  5       S!S"/5      u  p[0        R2                  " U5      R                  5       nUR5                  SS#9  UR!                  UUSUSUUUS$S%S&.SSSS.S'9	  UR7                  U	S(S)S*9  UR9                  S+5        [        R:                  " 5         X2 S,U S-3-  n[        R<                  " US.S/UR?                  5       S09  [        R                  " U5        [        S1UR@                   35        g s  snf )2N)   
   )figsizez#f2f2f2u    — u   
🔎 Unique z values in :F)dropnar   u   ⚠️ No values found for z, skipping.   u   ⚠️ Too many categories in z, showing top 20.Other   tab20Set2Tg333333?)gRQ?   z
upper left)bbox_to_anchorloctitlelabelswhiteMissingnone)colorlabel	edgecolor)columnaxlegendcategoricalcmap	linewidthlegend_kwdsmissing_kwdscoerce)errorsu   ⚠️ No numeric data for    _   )r   g333333?g{Gz?)r   shrinkpad)	r   r    r!   r   r   vminvmaxr"   r#      r   )fontsizer)   off_z_heatmap.pngi,  tight)dpibbox_inches	facecoloru   💾 Saved heatmap: )!copypltsubplotspatchset_facecolor
capitalizeprintvalue_countsr   uniquelencloseheadindexr   isinplotsortedstrpd
to_numericemptynpnanpercentiler   get_cmapset_bad	set_titleaxistight_layoutsavefigget_facecolorname)gdfattrstatesave_dirr    r   	gdf_localfigr   r   unique_vals
top_values	cmap_namevr*   r+   cmap_objout_paths                     1/data2/heatmap/scripts/visualize_all_attribute.pyplot_attribute_mapr_      s"   
Ill8,GC III&Y!"%(9':;E	N4&E7!
45	)/
&
&e
&
45o,,.557{q /v[ABIIcN {b 24&8IJK"557<<R@FFJELIMM9?//
;;TAB#/00299;K {aII"+# +!>+Q#a&+!>?	 !"# 	 	
, --	I	?!!#))/v[ABIIcN%%io&<&<&>BH
%%d+002w'"&#dC "# 	 	
  LLL,GGENG1TF,77HKKcw#BSBSBUVIIcN	 
01Y "?s   <M__main__   z>Usage: python -m scripts.visualize_all_attributes <STATE_NAME>r   OSM_State_Filesz_roads_projected.gpkgu   ❌ File not found: u   📦 Loading road data for z...roads_projected)layerlaneswidth)surfacematerialbridgetunnelrd   u   📊 Numeric attributes: u   🎨 Categorical attributes: u   
📈 Plotting z heatmap...)r    r   u   
🎨 Plotting z map...r   Tu3   
✅ All attribute heatmaps generated successfully!)r   F)$__doc__syspathlibr   	geopandasgpdpandasrE   matplotlib.pyplotpyplotr5   numpyrH   
matplotlibr   r_   __name__r=   argvr:   exitlowerrT   gdf_pathparentrU   existsr9   	read_fileroadsnumeric_attrscategorical_attrscolumnsavailable_numericavailable_categoricalrS   )as   0r^   <module>r      s          X2| z
388}qNOHHQKE%&.E7:O1PPHH??$XJ/0	'(8(8(:';3
?@MM(*;<Eg&ML$1HMq%--5GMH(9P(91%--=OQ(9P	%&7%8
9:	)*?)@
AB! k235$xiUZ[ " & g./5$xfRVW & 

@AC & IPs   F(F((F-?F-