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()
效果圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/236081.html
標籤:python
上一篇:訓練BlendMask時報錯_train_loader_from_config() takes 1 positional argument but 2 were given
下一篇:梯度下降與矩陣分解
