zoukankan      html  css  js  c++  java
  • 【作业】多图表

      为了表示出多图表,数据采用了老师在51Job上爬取的数据

      以下是涉及到的代码段

      数据库Dao层

    #定义一个职位数据操作的数据库访问类
    class JobPositionDao(BaseDao):
    
        def __init__(self):
            super().__init__()
    
        #   查询各个语言的平均薪资
        def findPositionClassify(self):
            sql = "select avg(job_meansalary),job_taskid,task_title from job_position,job_collect_task where job_position.job_taskid = job_collect_task.task_id group by job_taskid,task_title;"
            result = self.execute(sql,params=None)
            self.commit()
            return self.fetch()
        #   查询各个语言在不同城市的平均薪资
        def findCityPositionClassify(self):
            sql = "select avg(t1.job_meansalary) as m,t1.job_taskid,t2.task_title,t1.job_city from job_position t1 left join job_collect_task t2 on t1.job_taskid = t2.task_id group by job_taskid,job_city,t2.task_title order by t1.job_taskid asc,m desc;"
            result = self.execute(sql,params=None)
            self.commit()
            return self.fetch()
            pass
        #   查询python在不同日期上的岗位新发布数
        def findPythonNewCountByDate(self):
            sql = "SELECT COUNT(1) as count,jc.task_title,jp.FBTime FROM `job_position` as jp,`job_collect_task` as jc WHERE jp.job_taskid=5 GROUP BY jp.job_taskid,jp.FBTime ORDER BY jp.FBTime; "
            result = self.execute(sql, params=None)
            self.commit()
            return self.fetch()
            pass

      图表绘制

    from day022.spiderproject.spiderproject.dao.jobpositiondao import JobPositionDao
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    class Chart():
        def __init__(self,shape:tuple=None):
            plt.rcParams['font.sans-serif'] = ['SimHei']
            plt.rcParams['axes.unicode_minus'] = False
            self.__x,self.__y=shape or (None,None)
            plt.figure()
            pass
    
        def LineChart(self,dataList,colorList,labelList,xyMsg:tuple = None,title = None,count = 1):
            #   分块
            if self.__x and self.__y:
                axLine = plt.subplot(self.__x,self.__y,count)
                plt.sca(axLine)#    选择当前块
            for itData,c,l in zip(dataList,colorList,labelList):
                plt.plot(*itData,c=c,label=l)
    
            if xyMsg:
                plt.xlabel(xyMsg[0])
                plt.ylabel(xyMsg[1])
            if title:
                plt.title(title)
            plt.xticks(rotation=45) #横坐标标签旋转45度
            plt.legend(loc='best')
            pass
    
        def pieChart(self,dataList,labelList = None,title=None,count = 1):
            if self.__x and self.__y:
                axPie = plt.subplot(self.__x,self.__y,count)
                plt.sca(axPie)
            plt.pie(dataList,labels=labelList,autopct="%1.2f")# autopct是比率精度
            if title:
                plt.title(title)
            plt.axis('equal')
            pass
    
        def barChart(self,xData,yData,count = 1,title = None):
            if self.__x and self.__y:
                axBar = plt.subplot(self.__x,self.__y,count)
                plt.sca(axBar)
            plt.bar(x=xData,height=yData)
            for x,v in zip(xData,yData):
                plt.text(x,v+10,"{0}".format(v),ha="center")
            if title:
                plt.title(title)
            pass
    
        def show(self):
            plt.show()
    
    
    
        pass
    #   折线图数据处理和绘制函数
    def lineChart(jpDao:JobPositionDao,chartView:Chart):
        avgList = jpDao.findCityPositionClassify()
        lineList = {}
        #   分成{"语言标题":[(城市,薪资)],……}的格式,薪资保留两位小数
        for m, i, t, c in avgList:
            if not lineList.get(t):
                lineList[t] = []
            lineList[t].append((c, round(m, 2)))
        #   按城市排序
        for k in lineList.keys():
            lineList[k].sort(key=lambda x: x[0])
        minCityList = None
        #   因为采样数有限,所以取四个语言的样本中都有的城市
        for k in lineList.keys():
            if minCityList == None:
                minCityList = set(np.array(lineList[k]).T[0])
                continue
            minCityList &= set(np.array(lineList[k]).T[0])
        #   城市排序
        minCityList = sorted(list(minCityList))
        #   去除已有城市数据
        for k in lineList.keys():
            i = 0
            while i < len(minCityList):
                if lineList[k][i][0] != minCityList[i]:
                    lineList[k].pop(i)
                else:
                    i += 1
        dataList = [np.array(v).T for v in lineList.values()]
        dataList = [[it[0],it[1].astype(np.float)] for it in dataList]
        chartView.LineChart(dataList, ['red', 'green', 'blue', 'black'],
                            [k for k in lineList.keys()], xyMsg=("城市", "工资平均值"), title="四种语言在各个城市中的平均工资")
        pass
    
    
    def pieChart(jpDao:JobPositionDao,chartView:Chart):
        avgList = np.array(jpDao.findPositionClassify()).T
        labelList = [avgList[2][i]+":"+str(avgList[0][i].astype(np.float).round(2)) for i in range(avgList.__len__() + 1)]
        chartView.pieChart(avgList[0].astype(np.float).round(2),labelList=labelList,title="各个语言的总平均工资",count=2)
        pass
    
    def barChart(jpDao:JobPositionDao,chartView:Chart):
        avgList =np.array(jpDao.findPythonNewCountByDate()).T
        chartView.barChart(avgList[2],avgList[0].astype(np.int),count=3,title="Python职位在不同日期的新需求岗位数")
    
    
    jp = JobPositionDao()
    chartView = Chart(shape=(2,2))
    lineChart(jp,chartView)
    pieChart(jp,chartView)
    barChart(jp,chartView)
    chartView.show()

       结果

  • 相关阅读:
    store的应用
    创建简单的SimpleStore
    设置间隔一周的算法
    C#里缓存的使用
    javaFileWrite,FileReader
    javaArrayList
    java函数方法
    java学生管理系统(简易版)
    Tensorflow框架
    java日期
  • 原文地址:https://www.cnblogs.com/dofstar/p/11489644.html
Copyright © 2011-2022 走看看