数据分析之matplotlib和numpy的应用

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()

    

效果图
在这里插入图片描述

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值