From e3dcdc8800ba5b83dfaaaf6a834d9b040f4cd4bf Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Wed, 10 Sep 2025 15:42:32 +0800 Subject: [PATCH] 'commit' --- Model/RenkouModel.py | 133 ++++++++++++ Model/__pycache__/RenkouModel.cpython-310.pyc | Bin 0 -> 4448 bytes Model/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 134 bytes Routes/BigScreen.py | 200 +----------------- Routes/__pycache__/BigScreen.cpython-310.pyc | Bin 5896 -> 1264 bytes static/T1_Bar.html | 4 - 6 files changed, 140 insertions(+), 197 deletions(-) create mode 100644 Model/__pycache__/RenkouModel.cpython-310.pyc create mode 100644 Model/__pycache__/__init__.cpython-310.pyc diff --git a/Model/RenkouModel.py b/Model/RenkouModel.py index e69de29..7c54d12 100644 --- a/Model/RenkouModel.py +++ b/Model/RenkouModel.py @@ -0,0 +1,133 @@ +import json +import os +from pyecharts import options as opts +from pyecharts.charts import Bar, Line +from pyecharts.globals import CurrentConfig + +# 配置使用自定义的ECharts路径 +CurrentConfig.ONLINE_HOST = "https://gcore.jsdelivr.net/npm/echarts@6.0.0/dist/" + +class RenkouModel: + @staticmethod + def load_population_data(): + try: + # 获取当前文件所在目录的父目录,然后找到Data文件夹 + current_dir = os.path.dirname(os.path.abspath(__file__)) + project_root = os.path.dirname(current_dir) # 修正路径计算,只需要上一级目录 + data_path = os.path.join(project_root, "Data", "RenKou.json") + + with open(data_path, "r", encoding="utf-8") as f: + data = json.load(f) + return data + except Exception as e: + print(f"读取人口数据出错: {e}") + return [] + + @staticmethod + def generate_population_chart_config(year="2024"): + # 加载人口数据 + population_data = RenkouModel.load_population_data() + + # 筛选出州市级数据 + cities = [item for item in population_data if len(item["area_code"]) == 9 and item["area_code"].endswith("000") and item["area_code"][4:6] == "00" and item["area_code"][2:8] != "000000"] + + # 提取城市名称和人口数据 + city_names = [city["area_name"] for city in cities] + total_populations = [city["total_population"].get(year, 0) for city in cities] + urban_populations = [city["urban_population"].get(year, 0) for city in cities] + rural_populations = [city["rural_population"].get(year, 0) for city in cities] + + # 创建柱状图 + c = ( + Bar() + .add_xaxis(city_names) + .add_yaxis("总人口", total_populations, stack="stack1") + .add_yaxis("城镇人口", urban_populations, stack="stack1") + .add_yaxis("农村人口", rural_populations, stack="stack1") + .set_global_opts( + title_opts=opts.TitleOpts( + title=f"云南省各州市人口分布图({year}年)", + pos_top="1%", + pos_left="center" + ), + tooltip_opts=opts.TooltipOpts( + trigger="axis", + axis_pointer_type="shadow" + ), + legend_opts=opts.LegendOpts( + pos_top="8%", + pos_right="5%" + ), + datazoom_opts=[opts.DataZoomOpts()], + xaxis_opts=opts.AxisOpts( + axislabel_opts=opts.LabelOpts(rotate=45) + ), + yaxis_opts=opts.AxisOpts( + name="人口数量(万人)", + name_location="middle", + name_gap=40 + ) + ) + .set_series_opts( + label_opts=opts.LabelOpts(is_show=False), + markline_opts=opts.MarkLineOpts( + data=[opts.MarkLineItem(type_="average", name="平均值")] + ) + ) + ) + + # 获取图表的选项配置 + options_str = c.dump_options_with_quotes() + return json.loads(options_str) + + @staticmethod + def generate_urbanization_rate_chart_config(): + # 加载人口数据 + population_data = RenkouModel.load_population_data() + + # 筛选出州市级数据 + cities = [item for item in population_data if len(item["area_code"]) == 9 and item["area_code"].endswith("000") and item["area_code"][4:6] == "00" and item["area_code"][2:8] != "000000"] + + # 提取城市名称 + city_names = [city["area_name"] for city in cities] + + # 创建折线图 + line = ( + Line() + .add_xaxis(city_names) + ) + + # 添加各年份的城镇化率数据 + years = ["2020", "2021", "2022", "2023", "2024"] + for year in years: + urbanization_rates = [city["urbanization_rate"].get(year, 0) for city in cities] + line.add_yaxis(f"{year}年", urbanization_rates, + markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")])) + + line.set_global_opts( + title_opts=opts.TitleOpts( + title="云南省各州市城镇化率变化趋势", + pos_top="1%", + pos_left="center" + ), + tooltip_opts=opts.TooltipOpts(trigger="axis"), + legend_opts=opts.LegendOpts( + pos_top="8%", + pos_right="5%" + ), + datazoom_opts=[opts.DataZoomOpts()], + xaxis_opts=opts.AxisOpts( + axislabel_opts=opts.LabelOpts(rotate=45) + ), + yaxis_opts=opts.AxisOpts( + name="城镇化率(%)", + name_location="middle", + name_gap=40, + min_=0, + max_=100 + ) + ) + + # 获取图表的选项配置 + options_str = line.dump_options_with_quotes() + return json.loads(options_str) \ No newline at end of file diff --git a/Model/__pycache__/RenkouModel.cpython-310.pyc b/Model/__pycache__/RenkouModel.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f63dc9df9f79d97f328d444c4e0d8cc4d896a4b8 GIT binary patch literal 4448 zcmbVQ-E$Pj5#O2pxV;aZK9Fr>V@zzzg)x;>{*8T0g~QyFE9Ey5L%L@V>5#y#_^!6E zyJxPar>E!FeHV0eq!f7l`N@Bbzt^iM|3abtrGl^rp700|rZD0wR{TjU0y6b!QMELJ zI@Q;UhGi5JRzk{}Zx)kQ5_sKB+Nu2tGgx9?VTn0vr5PDja%K~(DkC`(C4#c>f>M~H zk@}p&BkiD9azWp*x5Bww5_^Nvm{*wDHZDXt+&MT{$OqgVmH{5 zA9uJ2_dGK&G%z&Cyig40af$Yq2ErbA!filY1-D^QS7n6Jd1a1R8t_S`F@2tZq=O{g z2Hs#MIGu{pFS(`3pmHdH)$cHGfJKbwUNrw6keO$NGC}H8QdMY+WRc7&v978BPb9Bb z2`;~=&Qf7iDN}LzntHBtRuzf5Syf@Cb_`;y!Fx_6N)@D0Wh?AqiVy|g$Ki>!nj(_Z zM~O146J@4Tq?l3FFDMu39Ly{z#}otRG8p}VKHB=6B2!8(F=A=Mj&NphcP|DN2yRe{ z2%pg_V(h6Ma2BRp$_LCV6)F$H)~^5lgT}dcu3o;}IQQFYZ~x(1?RSlZ%gvwta_6R8 zI-)@sX=O)@M+xTfl2de}gmW^K8q>DNJm0nLNSg?}QltfC7pPoL^8<%P$$h8uuFQu> zFLSRXa)y=8$BAHrJu6e@!GxO^HV*<}B^kJFOWR~D(ol+syQJ_3z|9+5hIgJ|;jw^E zo;Y49jX0$v@pn(i<2%uIlmq4Is23fu%R#x~JD89*T1(?`ZUjPUFU^oH(giei%b;C1 z4Vooc(3ofF&6!Q@#_nb)(zXq4`*NOusoSq4FlZkyTDTELgi_SE+BAlsb4p#sWSY=eqN*{IC2K11sj9xrr>l_V zQm+eRBEd3el?w{%xTvx$>ttOu6|^SnW<6|O4U%;t$$Hs+?0)3ysYRtgK$nIm!yaJk zYlQXHq=r4n9%38V!!?y{tQiv>a>gTUlN`;0)XBcU9%YZ!Xo0ZD;d}ixI-95_>Rk{E zQ*_sRs^%g>#uFoVgpWelba+PL`S@iZ1*NLIvKj9c+$p6Gg2%`tOz$_%{hQfE%8IPW|?MMsq-z%hrrjtv*UZQ_|(>d??o6S1U;x89;4p)*YrB?AWG zwFGG9Lvq8-Vd0b~#z8>`h9b=qZc(OZOxDA9qSP)Q@G2h^%eyy${4rX4S((|>o>T?5 z$n66H_8 zWJ}9?VtSS1{EIO17(CMBUS-XC7@u`Gz5$3lpVaO3>dINDDT_2-H%F~55eUa`+aAZu zvP2@a;0nGa=Cx_p;VY4o4m^$vV8}My+W|fR$jS3FT^uq z#cS_gyLi5(z(8ERe7;fp`G@cRu<_IR#$SKcxb&lVuyOXa#-+K&g};4tc#;GC}6eAZ82STZ_pk6H|W#-kU7u7LRJ!u!0d6+d%#3wMcFS^T!|oOFE~ z+JLZvL604V!qQwg2i{)2gc}B5Bctds=DSVIx||wmvbc00wK4Y*v?EiB1*g1ZSSh(1 zY1qn$An=7(j-|Bk!hK?~(1Acd69mOrOr4fHLU*jx^fLc^j#vrUX*eECSqbM=xQqo? zo>}AlKQ=BdG|pUsu;>^7o9~nR)nkQhHD1~TZ<5`7P_v(ues@2yNRIBe+7?FIG4&vs~4n+$VBFFb#sIYcq_@n?DKfL=|H1J*__O><0M`MJY!R*l(`pd_Ib~Cz$fkg_T7*`^&?@#& z?Pk@2!nEH&2U*pIl~*2lU1@6;;@Nr?+5lPTjf=FZ3w^?XC&3cTtPv>4Nhrvvno5*Y z8)2piV@Z}~8P>tF&=BYoDcKqj;L^*jfnLwZc0h+>uTNyLO#mzRL%|0PHV3RPZVGBT zv;_uquWG#$ioGGa>fKdC7W<9&F82H(2n5H9!XHH<@mWIlow$7*2XjDX_TTjYWR7_= zakD2&>*ubg{7bmjlSrfwSgr0>D^H*vK`^IV*boj$x>eF`l5Xdim7iH@;tSI5ysVa= zUTO-sIu^1D<`WcvNG&?2bA%tjfo}owkHp@sq#vr_t0iNWOw(ClFZRtH|#{@--y8k$fG=9wg5JsbHJXZWWNfA3&e)#Tmm$ zupMYJAURzEEPo!g`+-vT92wC)|X_x?CS<*{P03=NU5<*f60POB?CAI%C{%!UF zNNxWdcLaXE%XG~pBKT=1E3X};Y`Yk+iu{?Ev7tCPerqHHjg0W}MOTamEUtO-LVSNY z6fz!?$nFbkV+x)y3&d0?0&zA&=#DIr=bOvKM&KKq5kqetU3T5)UHx5(TT?{YV$Wy?X6;7`O1G1MOV EKM~-l%>V!Z literal 0 HcmV?d00001 diff --git a/Model/__pycache__/__init__.cpython-310.pyc b/Model/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39b0c8de97be66ae5c9f61f29e8fe60cafe061b6 GIT binary patch literal 134 zcmd1j<>g`kg7aDjGeGoX5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!Hfi&acYad>`F zc1&bxo?l{KKv8~HYH~@8Z+=Q@PE34!W?p7Ve7s&k6f03&c@!VTazGS!Esag%>*UQVxC*Qn?YPE!*JYV>_!7PNn>q)lc zVDbQJ{1F<47!FYvyBO;+35iRfw?eCHyEaA~Gn?gn%<}Jvo8!5?JS*&D=CI-}dWYSD zv6R44W))*`jHL>eIX2FV9l|Eqw0}I1twiJ$%r4@ka-Bv& z-`xIE5v4{l81Yh1$x^MUC?sLv}y1llxgo39p^XI{rS1HQhsnGfuDBOeB{}%{XI4de8W-~^-T2yTn z|5{NkX|^t9deJDEwpohVFRw-`BC2tlJrKFvl`Zi^!WFKvIo6C5NTY1Lgb=7X? z2{)PTaN8Sco*ZX9#oNY|6U^@9?Yv`5u@}jjG-^8eB3ZMTFXl^7vxKkXOZl=fX5YY< z^Dao1%C;-eb{${oE*nt!jeOOZf!>zOn$@VeiFeChx};H zy@v{UKPOzbTuq_F<}0r@Uq91){p^)jE}{>!BHV$(u}}}3yg#yeFbFFCUA?{eoG09# zA)mX&!V%F^c7xt>rPS-@1|1Rj_k5$Lucxn<7yO|28tcuGqOFgL!UuSL+T$k}XIw2X zOiAkxVaYbF#y8qbnzx9+^_ zAoo#w_+a$SUf~V7x!|B&AOGO?LVll|YENZ2)P?5-ouq~iq8_(Y(GF&gwi*O6ygTsv z0Z5>nP#P>y8``)s&Kf!=-T<$HSEu{#Dgt3YkOBOR}LCY7$9nQ1I9CRW~ zlx;IN=y|>y$%jcEnn#>s)%C*;-wm?)qIbxNdJJ{aDU9zYMfVUZTllUhxV{`DjPIuL zWnF4|s&h;C2W}}`&a0&geL)_OJz59`vyWH30AuPyzE=*7qUUfwqlGLNCa0VEfe2I6 z1!^{HP@;{d)|Ge5u5bc3d&m)4Y2w+O^q!@t_ParJHNjHyr~g+q5=>|9O#ejxxB7|I zkbTh}w7%J)g0Pja+(oZn5GqMNlKC9jYQKB2q)zfb_&pdzmrPr@K z^G5UB`;$-Bue^6b)?}C*0$Y}9RdD`PmgKSY^JmdR!_uay$4x_L;%i{%=tp(rs?rNy z12b}GpbW8wDybIe<7BJw4U*O17qDRBjhgiBacxu$%$iF60B_LFbc||2tYOtOwA2qE zWb62y(3ny~X`ix5@i!kuD5u{ecq6H<1o7ehOc^zpGSU&in`*{6<-B?VE%V9&#Y9_< z+8-PHrv8tzqe>>$Z|gf@#3RXv-0}ln6+sJzz{H4A4F)#e0l%=^a?az0a=y9(Q@i@R zcd*2lE?#V&dHM3$-(Rj@Xr8<{`SV}i)tyO(ss~G|IKf~T;{`!J62_cEzLZ$m>_DOD zX0xz0uTUnVcFW>sbQ$Voc47S9V>wrvW@uDIp&VpPJDH1uaTeX#sY(>BvJ{x?IJsU{ zcFhI^Sz5^41^Y=oXDeQ%T9lD7OCNm`ZT;0CDqEtaSem6l6Q7uB`nsvM!!py%I<8(9 zTcmEA`!?T}BkP-fXs45SHN1W|YNRd7og7nYY$rf(l=f0ZNtGq-q%y#;x9XTRCDEnC zXptCFVzx-kfFYKuWCcSSkJWUFh;wz(3^3*BioWk4AYXrMIUDqIu z5#;j4brrnDm+%|-QsNu&aV5_nOW;lNWqdi}Y!@OhBzy&5NuXQT`0Bbjl#(p~xw5tm zrFOoC09VH6b@*;Q;&ZGPYjhw!TS2lSr3(wl*+74O z&^t-)8LEAK6M+1pTPB0%J_SDr)SkXjFCaF~x17Y5BH$SaTiLoB-}|KWc4g$YnON6i zRIL%EXG_t`IYoafnCT7{%%0Su*?+VIM9$tEWzlS-`2c^S`H&Au)h1MN9~#?wt`H2* zQ&xNzHG8N((sGHiU_4rZ#Z-SIh#W65JzhgOh3s%#omxlLP6u89;F+DCAmc~i)DRoR zgAuO}yN-yoAPA5O>;)qgxbd?U5Ts=WgH**Kr#ycUL0!lp#6!f%>}96^?~!Of$Y)M( zrgu>l3#ah;y~_cq_bOS><>T)}A*n~u+O54(W`;W*&uBn^Whh`3G zrz<8j(SeFER`L97;8kpkn4&unggWI3P-)QN-qDO2#sX2u=UriUQU#V1QPUOKV7TI5 zQ}0-RO}%|R?B)^lX2+=$v>ps5H=>OFGzB&~Ko(=S)7P^ZOm#ULMCu~KPo6vjT`#>w z(}kv?St@W|bSDY1Gnya^4%^5~vt;;`S%j7>=AFufDblF7Q-S9dgMv&wd^=fm;YEBZ zTcU_O;(4X0n2;&b6fe^v$?p=Bh}tpd2ojCFEBC1R_8*$(Pd1Ogi-j;~%2}z5xB)H2 zGLXz78Ny}$C1_5fiwLEJf*e8M;G~4f{gG}mT}tehs!2Yz6Pnr3OqQ%|SR>*DWgCLv zLv#~aLu4%x!ZJadpGgSv?yzIli6rn~hYJC6wlG0XoTXLr?aulB2GM-)fM~u+`(ix} zcMFjXM5MDwD<+Q#yT2$OPPv-S5=_NU|5!KV z|8-rD{!x!QWN{jmWs6C5)l6>pH{^C3WNuf%AUV7lL+qnf@`dGw~Il@=_GS{pT>q{Kn-y zve20F_$suFq0Zt-IcB#MsEtq*sJ9e&2nk^)?}{+9 zZU8k+WMx{T9av}v9gTF&gx)|$0M+Wx!NP~J6f!z*_;OfC*hz;diI3J{jWBa6uE)hz zbS}P4*8)ye<5Z>KG&+e#J$f4 zjTdNi2^wU|2<4$xa*pAwF-R2@h%$(-bRLwUS%$LeS0P>q4^0Uv&7VGh<@CwsnHRuZ zedF2YGk+3f6ygAp?-Q{>Fu)IpKS<Q;W_hmQvo<5=$wJ+HG{=+)LO)@v)^yXU-_xQlu3H zB11$D6Dbmr!E|2qv_y%j%0xU6oDXoCwhhWTe0$LXEAu})3U2s6ZF3C6_+)KSFr+Z3 zUbjpOA+en;VHSd%E`uC}xdejZr-wi({g3%it4jvHBj|8sdG9O=Or39kL^Bzc7_q=E z$q_#wZRoCr&bc)@ParvzCtU*FmXq!bNYgRw-1}F@e>?ZcOOZFD%7MhK;ODt=xRQ>$ zv+B(`yT6C_K4mDl`Jq$qQLu9-)4CBk)XqF)SM<_6L}qQ|7C@ zmQ-#XIlCax{DnT-NaPsENV;_cDBD<|>&%*`(SG`FfwP(-Z{5`Sy3bkl(=Rn&eKtA> z%Z-sIQ8?%pbcH`@$ueZk#I11gyj3Ti{)*;Pt8E$<6T{Kx6uL4i!`Og>$Kamou7c^MLg1~N85`xa`rGLrTpH$cv%WgBM~!rD^uc(v$m rC1dev$dqE?mMAT6iY#Oz?V71sT7p@+wH(w+bXZ%hI~Ng$x1IeDM2023年 -
-

云南省各州市城镇化率变化趋势

-
-
点击"加载图表"按钮获取数据