一、选题背景
近年来,我国各个省份的粮食总产量以及增量增速逐渐倍受关注,如何增加粮食产量也成为了人们关注的热点话题。通过互联网上的信息发布网站,我获取并整合了各省粮食产量数据。其中,“中国产业信息网”每年发布的国内新一年的粮食产量信息。网站发布的信息包括近些年的粮食产量、占比、走势、播种面积等。本课题的目标是用python编程,抓取网站的数据,并将获取数据保存到Excel文件中,然后使用python对数据进行清洗及处理,利用python可视化,结合数据处理与分析,获得数据的统计分析结果。
二、数据获取与清洗
1.数据描述
数据来源:中国产业信息网网站页面
数据获取:中国产业信息网网站的信息,并将获这些信息写入excel表格。
2.使用工具
使用到的库有:
① matplotlib库
② requests库
③ pandas库
④ BeautifulSoup库
⑤ pyecharts库
⑥ bs4库
⑦ csv库
报告中使用requests库爬取网页获取数据,利用bs4库解析数据,利用pandas库读取数据,利用matplotlib库、BeautifulSoup库和pyecharts库实现数据可视化。
3.数据获取步骤
第一步:从网页上获取HTML内容。
第二步:分析网页内容并提取有用数据。
第三步:将获得的数据写入Excel文件。
4.程序代码
(1)获取数据及2016到2020年各地区粮食产量获取的代码如下(爬虫程序及运行结果如图1所示)
图1 爬虫程序及运行结果
(2)将获得的2016-2020全国各地区的粮食产量以csv形式存储到Excel表格中,代码如下:
3.数据保存到Excel文件(如图2所示)
图2 粮食产量Excel文件截图
三、数据处理和分析
1.数据分析
对全国各地区粮食总产量数据总体以及全国粮食产量排名前五的地区分析。用python对各地区粮食产量数据进行可视化处理,制作出柱状图。(如图3所示)
图3 各地区粮食产量走势
2.统计江西、山东、河南和湖北四省粮食产量,四省粮食的产量及对比绘制柱状图。(如图4所示)
图4 江西、山东、河南和湖北四省粮食产量柱状图
3.统计全国粮食产量排名前五名省(市,区)粮食产量,粮食产量总和绘制柱状图。(如图5所示)
图5 全国粮食产量排名前五名粮食产量总和图
4.统计全国粮食产量排名前五名省(市,区)粮食产量在全国的分布,绘制分布地图。(如图6所示)
图6 全国粮食总产量前五地区在全国的分布
5.统计全国粮食产量排名前五名省(市,区)粮食产量历年趋势,绘制折线图。(如图7所示)
图7 五省粮食总产折线图
6..统计全国各地区粮食总产量趋势,绘制折线图。(如图8所示)
图8 全国粮食总产量折线图
7.统计全国分地区粮食产量趋势,绘制折线图。(如图9所示)
图9 各地区粮食产量折线图
9.统计山东省粮食产量,粮食产量绘制饼状图(如图10所示)。绘制折线图(如图11所示)。绘制柱状图(如图12所示)。图10 各省份2021年各个省份的粮食产量占比
图11 山东省粮食产量折线图
图12 山东省粮食产量柱状图
10.基于数据可视化的进一步应用,添加了可以动态显示粮食产量分布的地图,随使用者的指针位置精准显示分省份分年份各地区的精确粮食产量,大大提高了用户使用体验,减少了使用成本。(注:图中的红点代表该地区的省会。地图如图13所示)
图13 全国各地区粮食产量地图
四、程序代码。
1 import requests 2 from bs4 import BeautifulSoup 3 import bs4 4 import csv 5 6 def getHTMLText(url): 7 try: 8 r = requests.get(url, timeout = 30) 9 r.raise_for_status() 10 r.encoding = r.apparent_encoding 11 return r.text 12 except: 13 return '爬取失败' 14 15 def fillUnivlist(ulist,html): 16 soup = BeautifulSoup(html,"html.parser") 17 for tr in soup.find('tbody').children: 18 if isinstance(tr,bs4.element.Tag): 19 tds = tr('td') 20 ulist.append([tds[0].text,tds[1].text,tds[2].text,tds[3].text,tds[4].text,tds[5].text]) 21 22 def printUnivList(ulist,num): 23 tplt="{0:8}\t{1:^8}\t{2:^8}\t{3:^8}\t{4:^8}\t{5:^8}" 24 for i in range(num): 25 u = ulist[i] 26 print(tplt.format(u[0],u[1],u[2],u[3],u[4],u[5])) 27 28 def writeUlistfile(ulist): 29 with open('Ulist1.csv','w',newline='') as fout: 30 writer = csv.writer(fout) 31 for row in ulist: 32 writer.writerow(row) 33 34 def main(): 35 url = 'https://www.chyxx.com/industry/202103/938485.html' 36 html = getHTMLText(url) 37 uinfo =[] 38 fillUnivlist(uinfo,html) 39 writeUlistfile(uinfo) 40 printUnivList(uinfo,32) 41 42 main() 43 ########################################################################################################### 44 45 46 import pandas as pd 47 import matplotlib. pyplot as plt 48 from matplotlib import rcParams 49 rcParams['font.family'] = 'simhei' #汉字显示的字体 50 sheet=pd.read_csv("C:\\Users\Qi520503\Desktop\mpython\\Ulist1.csv",encoding="GBK") 51 52 sheet_new=sheet[0:31]#数据太多,因此切片处理 53 sheet_new.plot.bar(x="地区",y=["2016年","2017年","2018年","2019年","2020年"], 54 color=["red", "blue", "yellow","green","orange"]) 55 plt. title('各地区粮食产量图', fontsize = 10, fontweight='bold') 56 plt. xlabel('地区', fontweight = 'bold') 57 plt. ylabel('粮食产量', fontweight = 'bold') 58 plt.hist(sheet['2020年'],bins=(50),color="green") 59 plt.title('2016-2020全国各地区粮食产量柱状图',fontsize=12,fontweight='bold') 60 plt.xlabel('地区',fontsize=12,fontweight='bold') 61 plt.ylabel('粮食产量/万吨',fontsize=12,fontweight='bold') 62 plt. show() 63 ########################################################################################################### 64 65 66 import pandas as pd 67 import matplotlib. pyplot as plt 68 from matplotlib import rcParams 69 rcParams['font.family'] = 'simhei' #汉字显示的字体 70 sheet=pd.read_csv("C:\\Users\Qi520503\Desktop\mpython\\Ulist3.csv",encoding="GBK") 71 sheet_new=sheet[0:100]#数据太多,因此切片处理 72 sheet_new.plot.bar(x="地区",y=["近五年总和"], color=["green"]) 73 plt. title('各地区粮食产量图', fontsize = 10, fontweight='bold') 74 plt. xlabel('地区', fontweight = 'bold') 75 plt. ylabel('粮食产量', fontweight = 'bold') 76 plt.hist(sheet['2020年'],bins=(50),color="green") 77 plt.title('2016-2020全国粮食产量排名前五名粮食产量总和图',fontsize=12,fontweight='bold') 78 plt.xlabel('地区',fontsize=12,fontweight='bold') 79 plt.ylabel('粮食产量/万吨',fontsize=12,fontweight='bold') 80 plt. show() 81 ########################################################################################################### 82 83 84 import pandas as pd 85 import matplotlib. pyplot as plt 86 from matplotlib import rcParams 87 rcParams['font.family'] = 'simhei' #汉字显示的字体 88 sheet=pd.read_csv("C:\\Users\\Qi520503\\Desktop\\mpython\\Ulist1.csv",encoding="GBK") 89 sheet_new=sheet[14:15]#数据太多,因此切片处理 90 sheet_new.plot.bar(x="地区",y=["2016年","2017年","2018年","2019年","2020年"], 91 color=["red", "blue", "yellow","green","orange"]) 92 plt. title('各地区粮食产量图', fontsize = 10, fontweight='bold') 93 plt. xlabel('地区', fontweight = 'bold') 94 plt. ylabel('粮食产量', fontweight = 'bold') 95 plt.hist(sheet['2020年'],bins=(50),color="green") 96 plt.title('2016-2020山东省粮食产量柱状图',fontsize=12,fontweight='bold') 97 plt.xlabel('地区',fontsize=12,fontweight='bold') 98 plt.ylabel('粮食产量/万吨',fontsize=12,fontweight='bold') 99 plt. show() 100 ########################################################################################################### 101 102 103 import pandas as pd 104 import matplotlib. pyplot as plt 105 from matplotlib import rcParams 106 rcParams['font.family'] = 'simhei' #汉字显示的字体 107 sheet=pd.read_csv("C:\\Users\\Qi520503\\Desktop\\mpython\\Ulist1.csv",encoding="GBK") 108 sheet_new=sheet[13:17]#数据太多,因此切片处理 109 sheet_new.plot.bar(x="地区",y=["2016年","2017年","2018年","2019年","2020年"], 110 color=["red", "blue", "yellow","green","orange"]) 111 plt. title('各地区粮食产量图', fontsize = 10, fontweight='bold') 112 plt. xlabel('地区', fontweight = 'bold') 113 plt. ylabel('粮食产量', fontweight = 'bold') 114 plt.hist(sheet['2020年'],bins=(50),color="green") 115 plt.title('2016-2020四省粮食产量柱状图',fontsize=12,fontweight='bold') 116 plt.xlabel('地区',fontsize=12,fontweight='bold') 117 plt.ylabel('粮食产量/万吨',fontsize=12,fontweight='bold') 118 plt. show() 119 ########################################################################################################### 120 121 122 import pandas as pd 123 import matplotlib.pyplot as plt 124 from matplotlib import rcParams 125 plt.figure(figsize=(15,10)) 126 rcParams ['font.family'] = 'simhei'#汉字显示的字体 127 df = pd.read_excel("C:\\Users\Qi520503\Desktop\mpython\\Ulist2.xlsx") 128 plt.legend(loc=2) #添加图例 129 plt.plot(df["年份"],df["北京市"],label='北京市',linewidth=1,color='g',marker='o', 130 markerfacecolor='blue',markersize=5) 131 plt.plot(df["年份"],df["天津市"],label='天津市',linewidth=1,color='r',marker='o', 132 markerfacecolor='green',markersize=6) 133 plt.plot(df["年份"],df["河北省"],label='河北省',linewidth=1,color='r',marker='o', 134 markerfacecolor='yellow',markersize=7) 135 plt.plot(df["年份"],df["山西省"],label='山西省',linewidth=1,color='g',marker='o', 136 markerfacecolor='red',markersize=8) 137 plt.plot(df["年份"],df["内蒙古自治区"],label='内蒙古自治区',linewidth=1,color='r',marker='o', 138 markerfacecolor='orange',markersize=5) 139 plt.plot(df["年份"],df["辽宁省"],label='辽宁省',linewidth=1,color='r',marker='o', 140 markerfacecolor='white',markersize=6) 141 plt.plot(df["年份"],df["吉林省"],label='吉林省',linewidth=1,color='g',marker='o', 142 markerfacecolor='pink',markersize=7) 143 plt.plot(df["年份"],df["黑龙江省"],label='黑龙江省',linewidth=1,color='r',marker='o', 144 markerfacecolor='black',markersize=8) 145 plt.plot(df["年份"],df["上海市"],label='上海市',linewidth=1,color='r',marker='o', 146 markerfacecolor='brown',markersize=5) 147 plt.plot(df["年份"],df["江苏省"],label='江苏省',linewidth=1,color='g',marker='o', 148 markerfacecolor='blue',markersize=6) 149 plt.plot(df["年份"],df["浙江省"],label='浙江省 ',linewidth=1,color='r',marker='o', 150 markerfacecolor='green',markersize=7) 151 plt.plot(df["年份"],df["安徽省"],label='安徽省',linewidth=1,color='r',marker='o', 152 markerfacecolor='yellow',markersize=8) 153 plt.plot(df["年份"],df["福建省"],label='福建省',linewidth=1,color='g',marker='o', 154 markerfacecolor='red',markersize=5) 155 plt.plot(df["年份"],df["江西省"],label='江西省',linewidth=1,color='r',marker='o', 156 markerfacecolor='orange',markersize=6) 157 plt.plot(df["年份"],df["山东省"],label='山东省',linewidth=1,color='r',marker='o', 158 markerfacecolor='white',markersize=7) 159 plt.plot(df["年份"],df["河南省"],label='河南省',linewidth=1,color='g',marker='o', 160 markerfacecolor='pink',markersize=8) 161 plt.plot(df["年份"],df["湖北省"],label='湖北省',linewidth=1,color='r',marker='o', 162 markerfacecolor='black',markersize=5) 163 plt.plot(df["年份"],df["湖南省"],label='湖南省',linewidth=1,color='r',marker='o', 164 markerfacecolor='brown',markersize=6) 165 plt.plot(df["年份"],df["广东省"],label='广东省',linewidth=1,color='r',marker='o', 166 markerfacecolor='blue',markersize=7) 167 plt.plot(df["年份"],df["广西壮族自治区"],label='广西壮族自治区',linewidth=1,color='r',marker='o', 168 markerfacecolor='green',markersize=8) 169 plt.plot(df["年份"],df["海南省"],label='海南省',linewidth=1,color='r',marker='o', 170 markerfacecolor='yellow',markersize=5) 171 plt.plot(df["年份"],df["重庆市"],label='重庆市',linewidth=1,color='r',marker='o', 172 markerfacecolor='red',markersize=6) 173 plt.plot(df["年份"],df["四川省"],label='四川省',linewidth=1,color='r',marker='o', 174 markerfacecolor='orange',markersize=7) 175 plt.plot(df["年份"],df["贵州省"],label='贵州省',linewidth=1,color='r',marker='o', 176 markerfacecolor='pink',markersize=8) 177 plt.plot(df["年份"],df["云南省"],label='云南省',linewidth=1,color='r',marker='o', 178 markerfacecolor='black',markersize=5) 179 plt.plot(df["年份"],df["西藏自治区"],label='西藏自治区',linewidth=1,color='r',marker='o', 180 markerfacecolor='brown',markersize=6) 181 plt.plot(df["年份"],df["陕西省"],label='陕西省',linewidth=1,color='r',marker='o', 182 markerfacecolor='blue',markersize=7) 183 plt.plot(df["年份"],df["甘肃省"],label='甘肃省',linewidth=1,color='r',marker='o', 184 markerfacecolor='green',markersize=8) 185 plt.plot(df["年份"],df["青海省"],label='青海省',linewidth=1,color='r',marker='o', 186 markerfacecolor='yellow',markersize=5) 187 plt.plot(df["年份"],df["宁夏回族自治区"],label='宁夏回族自治区',linewidth=1,color='r',marker='o', 188 markerfacecolor='red',markersize=6) 189 plt.plot(df["年份"],df["新疆维吾尔自治区"],label='新疆维吾尔自治区',linewidth=1,color='r',marker='o', 190 markerfacecolor='orange',markersize=7) 191 plt.xlabel("年份") 192 plt.ylabel('粮食产量/万吨') 193 plt.title("2016年-2020年各地区粮食产量折线图",fontsize = 30) 194 plt.legend(loc="best",fontsize = 8,markerscale=0.5,bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 195 plt.grid() 196 plt.show() 197 ########################################################################################################### 198 199 200 import pandas as pd 201 import matplotlib.pyplot as plt 202 from matplotlib import rcParams 203 rcParams ['font.family'] = 'simhei'#汉字显示的字体 204 df = pd.read_excel("C:\\Users\Qi520503\Desktop\mpython\\Ulist5.xlsx") 205 #plt.legend( labels = ['山东省'], loc = 7) #添加图例 206 #plt.legend(labels = ['山东省'], loc='lower center') 207 #plt.legend(loc="right") # 与plt.legend(loc=1)等价 208 plt.plot(df["年份"],df["粮食总产量"],label='粮食总产量',linewidth=1,color='r',marker='o', 209 markerfacecolor='white',markersize=7) 210 plt.xlabel("年份") 211 plt.ylabel('粮食产量/万吨') 212 plt.title("2016年-2020年全国粮食总产量产量折线图") 213 plt.legend(loc="best",fontsize = 8,markerscale=0.5,bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 214 plt.grid() 215 plt.show() 216 ########################################################################################################### 217 218 219 import pandas as pd 220 import matplotlib.pyplot as plt 221 from matplotlib import rcParams 222 rcParams ['font.family'] = 'simhei'#汉字显示的字体 223 df = pd.read_excel("C:\\Users\Qi520503\Desktop\mpython\\Ulist2.xlsx") 224 #plt.legend( labels = ['山东省'], loc = 7) #添加图例 225 #plt.legend(labels = ['山东省'], loc='lower center') 226 #plt.legend(loc="right") # 与plt.legend(loc=1)等价 227 plt.plot(df["年份"],df["山东省"],label='山东省',linewidth=1,color='r',marker='o', 228 markerfacecolor='white',markersize=7) 229 plt.xlabel("年份") 230 plt.ylabel('粮食产量/万吨') 231 plt.title("2016年-2020年山东省粮食产量折线图") 232 plt.legend(loc="best",fontsize = 8,markerscale=0.5,bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) 233 plt.grid() 234 plt.show() 235 ########################################################################################################### 236 237 238 import pandas as pd 239 import matplotlib.pyplot as plt 240 from matplotlib import rcParams 241 plt.figure(figsize=(15,10)) 242 rcParams ['font.family'] = 'simhei'#汉字显示的字体 243 df = pd.read_excel("C:\\Users\Qi520503\Desktop\mpython\\Ulist2.xlsx") 244 plt.legend(loc=3) #添加图例 245 246 plt.plot(df["年份"],df["黑龙江省"],label='黑龙江省',linewidth=1,color='r',marker='o', 247 markerfacecolor='red',markersize=6) 248 plt.plot(df["年份"],df["河南省"],label='河南省',linewidth=1,color='g',marker='o', 249 markerfacecolor='green',markersize=7) 250 plt.plot(df["年份"],df["山东省"],label='山东省',linewidth=1,color='b',marker='o', 251 markerfacecolor='blue',markersize=8) 252 plt.plot(df["年份"],df["安徽省"],label='安徽省',linewidth=1,color='y',marker='o', 253 markerfacecolor='yellow',markersize=6) 254 plt.plot(df["年份"],df["吉林省"],label='吉林省',linewidth=1,color='b',marker='o', 255 markerfacecolor='orange',markersize=7) 256 257 plt.xlabel("年份") 258 plt.ylabel('粮食产量/万吨') 259 plt.title("2016年-2020年五省粮食产量折线图",fontsize = 30) 260 plt.legend(loc="best",fontsize =20,markerscale=0.5,bbox_to_anchor=(1.15,1.0),borderaxespad = 1) 261 plt.grid() 262 plt.show() 263 ########################################################################################################### 264 265 266 267 import matplotlib.pyplot as plt 268 explode = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) 269 label = ['北京市','天津市','河北省','山西省','内蒙古自治区','辽宁省','吉林省', 270 '黑龙江省','上海市','江苏省','浙江省','安徽省','福建省', 271 '江西省','山东省','河南省','湖北省','湖南省','广东省','广西壮族自治区', 272 '海南省','重庆市','四川省','贵州省','云南省','西藏自治区', 273 '陕西省','甘肃省','青海省','宁夏回族自治区','新疆维吾尔自治区'] 274 data_list = [31,228,3796,1424,3664,2339,3803,7541,91,3729,606,4019,502,2164,5447,6826, 275 2727,3015,1268,1370,145,1081,3527,1058,1896,103,1275,1202,107,380,1583,] 276 fig = plt.figure() 277 ax = fig.add_subplot() 278 ax.pie(data_list, explode=explode, labels=label, autopct='%1.2f%%') 279 plt.title('2020年各地区粮食产量占比饼状图')#绘制标题 280 plt.show() 281 ########################################################################################################### 282 283 284 import matplotlib.pyplot as plt 285 explode = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) 286 label = ['北京市','天津市','河北省','山西省','内蒙古自治区','辽宁省','吉林省', 287 '黑龙江省','上海市','江苏省','浙江省','安徽省','福建省', 288 '江西省','山东省','河南省','湖北省','湖南省','广东省','广西壮族自治区', 289 '海南省','重庆市','四川省','贵州省','云南省','西藏自治区', 290 '陕西省','甘肃省','青海省','宁夏回族自治区','新疆维吾尔自治区'] 291 data_list = [31,228,3796,1424,3664,2339,3803,7541,91,3729,606,4019,502,2164,5447,6826, 292 2727,3015,1268,1370,145,1081,3527,1058,1896,103,1275,1202,107,380,1583,] 293 fig = plt.figure() 294 ax = fig.add_subplot() 295 ax.pie(data_list, explode=explode, labels=label, autopct='%1.2f%%') 296 plt.title('2020年各地区粮食产量占比饼状图')#绘制标题 297 plt.show() 298 ########################################################################################################### 299 300 301 import matplotlib.pyplot as plt 302 explode = (0,0) 303 label = ['黑龙江、河南、山东、吉林、安徽','其他地区',] 304 data_list = [27636,39311,] 305 fig = plt.figure() 306 ax = fig.add_subplot() 307 ax.pie(data_list, explode=explode, labels=label, autopct='%1.2f%%') 308 plt.title('2020年五省占全国粮食总产量饼状图')#绘制标题 309 plt.show() 310 ########################################################################################################### 311 312 313 from pyecharts import Map 314 province_distribution = {'北京':[31], '天津': 228, '河北':3796, '山西':1424 , '内蒙古': 3664, '辽宁':2339, 315 '吉林':3803, '黑龙江':7541, '上海': 91, '江苏':3729,'浙江':606, '安徽':4019, 316 '福建':502, '江西':2164,'山东':5447,'河南':6826,'湖北':2727, '湖南':3015, 317 '广东':1268, '广西':1370, '海南':145, '重庆':1081, '四川':3527, '贵州':1058, '云南':1896, 318 '西藏':103,'陕西': 1275,'甘肃':1202,'青海':107,'宁夏': 380,'新疆':1583,} 319 provice = list(province_distribution.keys()) 320 values = list(province_distribution.values()) 321 map = Map("全国各地区2020年粮食产量地图/(单位:万吨)(注:图中统计数据无我国台湾、香港、澳门地区)",width=1200, height=800) 322 map.add("", provice, values, visual_range=[0, 5000], maptype='china', is_visualmap=True, 323 visual_text_color='#000',is_label_show=True) 324 map.render(path="全国各地区2020年粮食产量地图.html") 325 ########################################################################################################### 326 327 328 329 from pyecharts import Map 330 province_distribution = {'黑龙江':37377.28, '河南':33192.53,'山东':26830.1,'吉林':19618.37,'安徽':20061.72,} 331 provice = list(province_distribution.keys()) 332 values = list(province_distribution.values()) 333 map = Map("2016-2020年全国粮食总产量前五地区在全国的分布地图",width=1200, height=600) 334 map.add("",provice, values, visual_range=[15000,30000], maptype='china', is_visualmap=True, 335 visual_text_color='#000',is_label_show=True) 336 map.render(path="2016-2020年全国粮食总产量前五地区在全国的分布地图.html")
五、总结
经过对python的学习,收获颇多。从最开始对计算机的基础知识的学习,让我们了解了计算机的最基本原理。接着学习了基本的python语言的编程和练习,让我们感受到与其它编程语言相比python语言的简洁直观,比如,列表,字典,函数等。最重要的对python中部分库的了解和学习,学会了利用python对网页数据的获取、数据处理、数据分析、数据可视化,让我感到python工具的实用性。在学习过程中遇到了大大小小的问题,通过我们的独立思考和各种资料的查找,问题一一解决,让我们发现学习大学计算机的乐趣。在以后的学习中,我们会利用学习到的知识对生活中和学习中需要数据处理的问题进行数据可视化处理。对python的学习还不是很全面,我们还会不断学习和练习python语言,提升个人的编程能力。
标签:数据分析,plot,粮食产量,df,label,color,plt,进行 From: https://www.cnblogs.com/wukaixin/p/17459212.html