python实验作业:请结合numpy库和Matplotlib库,根据输入的指定国家缩写,输出不同国家肉类消费的基本情况和预测(2020及以后的数据是预测)走势图。
点击下载数据表格
这里采用面向对象的理念编写该程序,代码如下:
# -*- coding: utf-8 -*-
"""
Created on Mon Dec 14 21:07:04 2020
@author: 散修涵
"""
import csv
import numpy as np
import tkinter as tk
import jieba
import jieba.posseg as psg
from jieba import analyse
import matplotlib.pyplot as plt
import wordcloud
from imageio import imread
from tkinter import *
import time
from tkinter import ttk
from PIL import Image, ImageTk
from PIL.ImageTk import PhotoImage
import os,sys
import matplotlib
'''
数据分析类
'''
class dataAnalyse:
def __init__(self,name):
self.name=name
self.Main()
def Main(self):
for i in ["KG_CAP","THND_TONNE"]:
self.readDataKg(self.name,i)
def readDataKg(self,name,danwei):
beefDataKg=[]
pigDataKg=[]
poultryDataKg=[]
sheepDataKg=[]
with open('meat_consumption_worldwide.csv','r') as s:
reader=csv.reader(s) #为包含所有的列表对象,不可关闭文件
for row in reader:
if name in row and 'BEEF' in row and danwei in row:
beefDataKg.append((row[3],row[4]))
if (name in row) and ('PIG' in row) and danwei in row:
pigDataKg.append((row[3],row[4]))
if name in row and 'POULTRY' in row and danwei in row:
poultryDataKg.append((row[3],row[4]))
if name in row and 'SHEEP' in row and danwei in row:
sheepDataKg.append((row[3],row[4]))
self.pltShow(name,beefDataKg,pigDataKg,poultryDataKg,sheepDataKg,danwei)
def pltShow(self,name,beefData,pigData,poultryData,sheepData,dataType):
matplotlib.rcParams['font.family']='Kaiti' #中文正常显示
# x=np.array(filter(lambda x:int(x[0]),beefData))
x1=np.array([int(i[0]) for i in beefData])
x2=np.array([int(i[0]) for i in pigData])
x3=np.array([int(i[0]) for i in poultryData])
x4=np.array([int(i[0]) for i in sheepData])
yBeef=np.array([round(float(i[1]),2) for i in beefData])
# print(x,yBeef)
# print(type(yBeef))
yPig=np.array([round(float(i[1]),2) for i in pigData])
yPoultry=np.array([round(float(i[1]),2) for i in poultryData])
ySheep=np.array([round(float(i[1]),2) for i in sheepData]) #保留两位小数
plt.suptitle(name+'肉类消费基本情况及预测')
plt.plot(x1[:-7],yBeef[:-7],'r.-',x1[-7:],yBeef[-7:],'rv:',x2[:-7],yPig[:-7],'g.-',x2[-7:],yPig[-7:],'gv:',x3[:-7],yPoultry[:-7],'b.-',x3[-7:],yPoultry[-7:],'bv:',x4[:-7],ySheep[:-7],'y.-',x4[-7:],ySheep[-7:],'yv:')
# plt.xticks(x)
plt.xlabel('年份/year')
plt.ylabel(dataType)
plt.legend(['牛肉','未来预测','猪肉','未来预测','家禽肉','未来预测','羊肉','未来预测'])
plt.savefig(r'F:\实验\数据分析\趋势图\{}肉类消费基本情况及预测{}单位.jpg'.format(self.name,dataType))
plt.clf()
'''
GUI界面类
'''
class GUI:
def __init__(self):
self.root=Tk()
self.page2 = None
self.root.title('数据分析系统 @author: 散修涵')
self.root.geometry('300x400')
self.main()
mainloop()
def main(self):
self.country=['AUS', 'CAN', 'JPN', 'KOR', 'MEX', 'NZL', 'TUR', 'USA', 'DZA', 'ARG', 'BGD', 'BRA', 'CHL', 'CHN', 'COL', 'EGY', 'ETH', 'GHA', 'HTI', 'IND', 'IDN', 'IRN', 'ISR', 'KAZ', 'MYS', 'MOZ', 'NGA', 'PAK', 'PRY', 'PER', 'PHL', 'RUS', 'SAU', 'ZAF', 'SDN', 'TZA', 'THA', 'UKR', 'URY', 'VNM', 'ZMB', 'WLD', 'SSA', 'OECD', 'BRICS', 'EU28', 'NOR', 'CHE']
self.pagePeople = Frame(self.root)
self.pagePeople.pack(side=LEFT)
self.root.geometry('600x360')
Label(self.pagePeople, text='国家列表', fg='black', font=('宋体', 25)).pack(side=TOP, fill='x')
self.checkDate = ttk.Treeview(self.pagePeople,column=('name' ))
self.checkDate.heading('#0', text='序号')
self.checkDate.heading('name',text='国家名')
self.checkDate.column('name', width=300,anchor="center")
c=list(range(1,len(self.country)+1))
d=[]
for inde in range(0,len(self.country)):
d.append(self.country[inde])
dict1 = dict(zip(c, d))
rowCount=1
self.checkDate.tag_configure("evenColor",background="LightBlue")
for inde in dict1.keys():
if rowCount%2==0:
self.checkDate.insert("", 'end',text=inde, values=dict1[inde])
else:
self.checkDate.insert("", 'end',text=inde, values=dict1[inde],tags=("evenColor"))
rowCount+=1
def show(*arge):
self.datatype="KG_CAP"
self.datanext="THND_TONNE"
if self.page2:
self.page2.pack_forget()
yuan=self.checkDate.selection()
self.i=yuan[0]
self.i=self.i[1:4]
self.i=int(self.i, 16)
self.imgPeople()
self.checkDate.bind('<<TreeviewSelect>>',show)
yscrollbar = Scrollbar(self.pagePeople, orient=VERTICAL, command=self.checkDate.yview)
self.checkDate.configure(yscrollcommand=yscrollbar.set)
yscrollbar.pack(side=RIGHT, fill=Y)
self.checkDate.pack(expand = 1, fill = BOTH)
def imgPeople(self):
#text=Tongji(self.name, self.people)
def resize( w_box, h_box, pil_image):
w, h =640,480
f1 = 1.0*w_box/w
f2 = 1.0*h_box/h
factor = min([f1, f2])
width = int(w*factor)
height = int(h*factor)
return pil_image.resize((width, height), Image.ANTIALIAS)
self.page2 = Frame(self.root)
self.page2.pack()
w_box=960
h_box=720
pil_image = Image.open(r'F:/实验/数据分析/趋势图/{}肉类消费基本情况及预测{}单位.jpg'.format(self.country[self.i-1],self.datatype))
pil_image_resized = resize( w_box, h_box, pil_image)
tk_image = ImageTk.PhotoImage(pil_image_resized)
label =Label(self.page2, image=tk_image, width=w_box, height=h_box).pack(side=TOP)
button21= Button(self.page2, width=18, height=2, text="清除", bg='gray', font=("宋", 12),relief='raise',command = self.backPeoList)
button21.pack(padx=5,pady = 5)
button21= Button(self.page2, width=20, height=2, text="以{}为单位".format(self.datanext), bg='gray', font=("宋", 12),relief='raise',command = self.img)
button21.pack(padx=5,pady = 5)
mainloop()
def img(self):
if self.page2:
self.page2.pack_forget()
temp=self.datatype
self.datatype=self.datanext
self.datanext=temp
self.imgPeople()
def backPeoList(self):
self.page2.pack_forget()
if __name__=="__main__":
#country=['AUS', 'CAN', 'JPN', 'KOR', 'MEX', 'NZL', 'TUR', 'USA', 'DZA', 'ARG', 'BGD', 'BRA', 'CHL', 'CHN', 'COL', 'EGY', 'ETH', 'GHA', 'HTI', 'IND', 'IDN', 'IRN', 'ISR', 'KAZ', 'MYS', 'MOZ', 'NGA', 'PAK', 'PRY', 'PER', 'PHL', 'RUS', 'SAU', 'ZAF', 'SDN', 'TZA', 'THA', 'UKR', 'URY', 'VNM', 'ZMB', 'WLD', 'SSA', 'OECD', 'BRICS', 'EU28', 'NOR', 'CHE']
#for i in country:
#test=dataAnalyse(i)
'''
调用GUI前先解放上面的注释生成统计图,之后再打上注释
'''
gui=GUI()
效果图: