利用pandas分析数据并通过matplotlib在tkinter上绘图

利用pandas分析数据并通过matplotlib在tkinter上绘图

先看下效果:
在这里插入图片描述

嘻嘻

资源下载(不用积分):
下载文件

你需要掌握的知识:
1.文件操作os库
2.tkinter图形库
3.pandas数据分析库
4.matplotlib绘图库
5.python的基础知识
源代码如下:

import pandas as pd
from tkinter import *
from tkinter import ttk
import tkinter as tk
import os
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2Tk 
import mpl_toolkits.axisartist as axisartist
class Analysis_of_the_vaccine:
    def __init__(self):
        self.root=Tk()
        self.root.geometry('1000x800')
        self.root.iconbitmap('0.gif')
        self.alldata=self.get_data()
        self.Gui()
        self.root.mainloop()
    def get_data(self):
        file_dir='D:/python_test/files'   
        all_file_list=os.listdir(file_dir)
        first=True
        for i in range(len(all_file_list)):
            if first:
                csv=pd.read_csv('files/'+all_file_list[i])
                first=False
            else:
                tmp=pd.read_csv('files/'+all_file_list[i])
                csv=pd.concat([csv,tmp],axis=0)
        csv=csv.dropna()
        csv.reset_index(drop=True,inplace=True)
        csv['price']=csv['price'].astype(str)
        for i in range(csv.shape[0]):
            csv['price'][i]=csv['price'][i].split('元')[0].split('/')[0]
        li=csv['price'].values.tolist()
        unuses=['议价失败','GMP到期,放弃议价','企业放弃议价','未报价','参考采购价参考(']
        for unuse in unuses:
            if unuse in li:
                csv=csv.drop(csv[csv['price']==unuse].index)
        csv.reset_index(drop=True,inplace=True)
        self.create_company=csv['create_company'].unique()
        self.names=csv['name'].unique()
        self.province=[name[:-4] for name in all_file_list]
        return csv
    def get_pro_data(self,pro):
        pro_data=self.alldata[self.alldata['prov']==pro]
        pro_data.reset_index(drop=True,inplace=True)
        return pro_data
    def Gui(self):
        numIdx=4
        frames=[PhotoImage(file='100.gif', format='gif -index %i' %(i)) for i in range(numIdx)]
        def update(idx):
            frame = frames[idx]
            idx+=1
            label.configure(image=frame)
            self.root.after(100, update, idx%numIdx)
        self.labelframe=LabelFrame(self.root,text='图片展示',height=700,width=740)
        self.labelframe.pack(side='right')
        self.labelframe.pack_propagate(0)
        label=Label(self.labelframe)
        label.pack()
        self.root.after(0, update, 0)
        self.menubar=tk.Menu(self.root)
        self.filemenu=tk.Menu(self.menubar,tearoff=0)
        self.menubar.add_cascade(label='退出',menu=self.filemenu)
        self.filemenu.add_command(label='退出',command=self.Exit)
        self.root.config(menu=self.menubar)
        self.labelframe=LabelFrame(self.root,text='基本操作')
        self.labelframe.pack(side='left')
        v=tk.IntVar()
        r1=tk.Radiobutton(self.labelframe,text='各疫苗生产厂家生产的疫苗类别',variable=v,value=1,command=self._1)
        r1.pack(anchor="w")
        r2=tk.Radiobutton(self.labelframe,text='各省采购的疫苗类别和价格之间的关系',variable=v,value=2,command=self._2)
        r2.pack(anchor="w")
        r3=tk.Radiobutton(self.labelframe,text='同类疫苗在不同生产企业的价格走势',variable=v,value=3,command=self._3)
        r3.pack(anchor="w")
        self.root.mainloop()
    def Convert(self,para1,para2):
        self.canvas=FigureCanvasTkAgg(para1,para2)
        self.canvas.draw() 
        cv=self.canvas.get_tk_widget()
        cv.pack(side=tk.TOP, fill=tk.X, expand=1)
        toolbar=NavigationToolbar2Tk(self.canvas,para2) 
        toolbar.update()
        self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH,expand=1)
    def Exit(self):
        self.root.destroy()
    def exit(self):
        self.root1.destroy()
    def display(self):
        self.root1=Tk()
        self.root1.geometry('1000x800')
        self.labelframe1=LabelFrame(self.root1,text='子窗口',height=900,width=700)
        self.labelframe1.pack(fill='both',padx=5,pady=5)
        self.labelframe1.pack_propagate(0)
        self.labelframe2=LabelFrame(self.labelframe1,text='显示区',height=700,width=750)
        self.labelframe2.pack(side='right')
        self.labelframe2.pack_propagate(0)
        self.labelframe3=LabelFrame(self.labelframe1,text='操作区',width=230)
        self.labelframe3.pack(side='left',fill='y')
        self.labelframe3.pack_propagate(0)
    def display1(self,value_name,func,fir_msg):
        number=tk.StringVar()
        self.Listchoose=ttk.Combobox(self.labelframe3,width=150,height=40,textvariable=number,state='readonly')
        self.Listchoose['values']=list(value_name)    
        self.Listchoose.bind("<<ComboboxSelected>>",func)
        self.Listchoose.set(fir_msg)  
        self.Listchoose.pack() 
        self.button=Button(self.labelframe3, width=27, height=1, text="退出", bg='#FFD700',font=("楷", 12),command=self.exit)
        self.button.pack()
    def _3(self):
        self.display()
        self.display1(self.names,self._3event,'疫苗信息')
    def _3event(self,event):
        self.labelframe2.destroy()
        self.labelframe2=LabelFrame(self.labelframe1,text='显示区',height=700,width=750)
        self.labelframe2.pack(side='right')
        self.labelframe2.pack_propagate(0)
        alldata=self.alldata
        alldata['price']=alldata['price'].astype(float)
        alldata=alldata.drop(alldata[alldata['price']==0.].index)
        name=self.Listchoose.get()
        self.labelframe1['text']=name
        alldata['company_pro']=alldata['create_company']+'('+alldata['prov']+')'
        company=alldata[alldata['name']==name]['company_pro'].values
        price=alldata[alldata['name']==name]['price'].values
        self.figure=plt.figure()
        self.figure.clf()
        matplotlib.rcParams["font.family"] = "SimHei"
        plt.yticks(fontsize=5)
        plt.barh(company,price)
        self.Convert(self.figure,self.labelframe2)
    def _2(self): 
        self.display()  
        self.display1(self.province,self._2event,'省份')
    def _2event(self,event):
        self.labelframe2.destroy()
        self.labelframe2=LabelFrame(self.labelframe1,text='显示区',height=700,width=750)
        self.labelframe2.pack(side='right')
        self.labelframe2.pack_propagate(0)
        self.labelframe1['text']=self.Listchoose.get()
        pro_data=self.get_pro_data(self.Listchoose.get())
        pro_data['price']=pro_data['price'].astype(float)
        pro_data.reset_index(drop=True,inplace=True)
        price=[]
        names=pro_data['name'].unique()
        for name in names:
            price.append(pro_data.iloc[pro_data[pro_data['name']==name].index[0]][6])
        if max(price)<=0:
            price=[1 for i in price]
        self.figure=plt.figure()
        self.figure.clf()
        matplotlib.rcParams["font.family"] = "SimHei"
        plt.pie(x=price,labels=list(names),autopct='%.1f%%',labeldistance=1,radius=1,startangle=45,rotatelabels=True)
        self.Convert(self.figure,self.labelframe2)
    def _1(self):     
        self.display()
        yscrollbar=Scrollbar(self.root1)
        yscrollbar.pack(side='right',fill='y')
        self.text=Text(self.labelframe2,width=80,height=50,yscrollcommand=yscrollbar.set)
        self.text.pack()
        yscrollbar.config(command=self.text.yview)
        yscrollbar.pack()
        self.display1(self.create_company,self._1event,'生产厂家')
    def _1event(self,event):
        company=self.Listchoose.get()
        self.text.delete('1.0','end')
        self.labelframe1['text']=company
        names=self.alldata[self.alldata['create_company']==company]['name'].unique()
        for name in names:
            self.text.insert(END,name+'\n\n')

最后

如果你有疑问,请在评论区毫不犹豫地指出;如果你发现的我的问题,或者你有更好的想法,请告诉我;如果你对本篇文章感兴趣并且获得知识的话,请毫不犹豫地点赞关注我吧!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小z吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值