精华内容
下载资源
问答
  • 本来想参照:https://mp.weixin.qq.com/s/e7Wd7aEatcLFGgJUDkg-EQ搞一个往年编程语言动态图的,奈何找不到数据,有数据来源的欢迎在评论区留言。 这里找到了一个,是2020年6月的编程语言排行,供大家看一下:...

    本来想参照: https://mp.weixin.qq.com/s/e7Wd7aEatcLFGgJUDkg-EQ 搞一个往年编程语言动态图的,奈何找不到数据,有数据来源的欢迎在评论区留言。

    这里找到了一个,是2020年6月的编程语言排行,供大家看一下: https://www.tiobe.com/tiobe-index/

    我们要实现的效果是:

    大学排名来源: http://www.zuihaodaxue.com/ARWU2003.html

    部分截图:

    在http://www.zuihaodaxue.com/ARWU2003.html中的年份可以选择,我们解析的页面就有了:

    "http://www.zuihaodaxue.com/ARWU%s.html" % str(year)
    

    初步获取页面的html信息的代码:

    def get_one_page(year):
        try:
            headers = {
                    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
                }
            url = "http://www.zuihaodaxue.com/ARWU%s.html" % str(year)
            response=requests.get(url,headers=headers)
            if response.status_code == 200:
                return response.content
        except RequestException:
            print('爬取失败')
    

    我们在页面上进行检查:

    数据是存储在表格中的,这样我们就可以利用pandas获取html中的数据,基本语法:

    tb = pd.read_html(url)[num]
    

    其中的num是标识网页中的第几个表格,这里只有一个表格,所以标识为0。初步的解析代码就有了:

    def parse_on_page(html,i):
        tb=pd.read_html(html)[0]
        return tb
    

    我们还要将爬取下来的数据存储到csv文件中,基本代码如下:

    def save_csv(tb):
        start_time=time.time()
        tb.to_csv(r'university.csv', mode='a', encoding='utf_8_sig', header=True, index=0)
        endtime = time.time()-start_time
        print('程序运行了%.2f秒' %endtime)
    

    最后是一个主函数,别忘了还有需要导入的包:

    import requests
    from requests.exceptions import RequestException
    import pandas as pd
    import time
    def main(year):
        for i in range(2003,year):
            html=get_one_page(i)
            tb=parse_on_page(html,i)
            #print(tb)
            save_csv(tb)
    if __name__ == "__main__":
        main(2004)
    

    运行之后,我们在同级目录下就可以看到university.csv,部分内容如下:

    存在两个问题:

    (1)缺少年份

    (2)最后一列没有用

    (3)国家由于是图片表示,没有爬取下来

    (4)排名100以后的是一个区间

    我们接下来一一解决:

    (1)删掉没用的列

    def parse_on_page(html,i):
        tb=pd.read_html(html)[0]
        # 重命名表格列,不需要的列用数字表示
        tb.columns = ['world rank','university', 2, 'score',4]
        tb.drop([2,4],axis=1,inplace=True)
        return tb
    

    新的结果:

    (2) 对100以后的进行唯一化,增加一列index作为排名标识

    tb['index_rank'] = tb.index
    tb['index_rank'] = tb['index_rank'].astype(int) + 1
    

    (3)新增加年份

    tb['year'] = i
    

    (4)新增加国家

    首先我们进行检查:

    发现国家在td->a>img下的图像路径中有名字:UnitedStates。 我们可以取出src属性,并用正则匹配名字即可。

    def get_country(html):
        soup = BeautifulSoup(html,'lxml')
        countries = soup.select('td > a > img')
        lst = []
        for i in countries:
            src = i['src']
            pattern = re.compile('flag.*\/(.*?).png')
            country = re.findall(pattern,src)[0]
            lst.append(country)
        return lst
    

    然后这么使用:

    # read_html没有爬取country,需定义函数单独爬取
    tb['country'] = get_country(html)
    

    最终解析的整体函数如下:

    def parse_on_page(html,i):
        tb=pd.read_html(html)[0]
        # 重命名表格列,不需要的列用数字表示
        tb.columns = ['world rank','university', 2, 'score',4]
        tb.drop([2,4],axis=1,inplace=True)
        tb['index_rank'] = tb.index
        tb['index_rank'] = tb['index_rank'].astype(int) + 1
        tb['year'] = i
        # read_html没有爬取country,需定义函数单独爬取
        tb['country'] = get_country(html)
        return tb
    

    运行之后:

    最后我们要提取属于中国部分的相关信息:

    首先将年份改一下,获取到2019年为止的信息:

    if __name__ == "__main__":
        main(2019)
    

    然后我们提取到中国高校的信息,直接看代码理解:

    def analysis():
        df = pd.read_csv('university.csv')
        # 包含港澳台
        # df = df.query("(country == 'China')|(country == 'China-hk')|(country == 'China-tw')|(country == 'China-HongKong')|(country == 'China-Taiwan')|(country == 'Taiwan,China')|(country == 'HongKong,China')")[['university','year','index_rank']]
    
        # 只包括内地
        df = df.query("(country == 'China')")
        df['index_rank_score'] = df['index_rank']
        # 将index_rank列转为整形
        df['index_rank'] = df['index_rank'].astype(int)
    
        # 美国
        # df = df.query("(country == 'UnitedStates')|(country == 'USA')")
    
        #求topn名
        def topn(df):
            top = df.sort_values(['year','index_rank'],ascending = True)
            return top[:20].reset_index()
        df = df.groupby(by =['year']).apply(topn)
    
        # 更改列顺序
        df = df[['university','index_rank_score','index_rank','year']]
        # 重命名列
        df.rename (columns = {'university':'name','index_rank_score':'type','index_rank':'value','year':'date'},inplace = True)
    
        # 输出结果
        df.to_csv('university_ranking.csv',mode ='w',encoding='utf_8_sig', header=True, index=False)
        # index可以设置
    

    本来是想爬取从2003年到2019年的,运行时发现从2005年开始,页面不一样了,多了一列:

    方便起见,我们就只从2005年开始了,还需要修改一下代码:

        # 重命名表格列,不需要的列用数字表示
        tb.columns = ['world rank','university', 2,3, 'score',5]
        tb.drop([2,3,5],axis=1,inplace=True)
    

    最后是整体代码:

    import requests
    from requests.exceptions import RequestException
    import pandas as pd
    import time
    from bs4 import BeautifulSoup
    import re
    def get_one_page(year):
        try:
            headers = {
                    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
                }
            url = "http://www.zuihaodaxue.com/ARWU%s.html" % str(year)
            response=requests.get(url,headers=headers)
            if response.status_code == 200:
                return response.content
        except RequestException:
            print('爬取失败')
    def parse_on_page(html,i):
        tb=pd.read_html(html)[0]
        # 重命名表格列,不需要的列用数字表示
        tb.columns = ['world rank','university', 2,3, 'score',5]
        tb.drop([2,3,5],axis=1,inplace=True)
        tb['index_rank'] = tb.index
        tb['index_rank'] = tb['index_rank'].astype(int) + 1
        tb['year'] = i
        # read_html没有爬取country,需定义函数单独爬取
        tb['country'] = get_country(html)
        return tb
    def save_csv(tb):
        start_time=time.time()
        tb.to_csv(r'university.csv', mode='a', encoding='utf_8_sig', header=True, index=0)
        endtime = time.time()-start_time
        print('程序运行了%.2f秒' %endtime)
    # 提取国家名称
    def get_country(html):
        soup = BeautifulSoup(html,'lxml')
        countries = soup.select('td > a > img')
        lst = []
        for i in countries:
            src = i['src']
            pattern = re.compile('flag.*\/(.*?).png')
            country = re.findall(pattern,src)[0]
            lst.append(country)
        return lst
    def analysis():
        df = pd.read_csv('university.csv')
        # 包含港澳台
        # df = df.query("(country == 'China')|(country == 'China-hk')|(country == 'China-tw')|(country == 'China-HongKong')|(country == 'China-Taiwan')|(country == 'Taiwan,China')|(country == 'HongKong,China')")[['university','year','index_rank']]
    
        # 只包括内地
        df = df.query("(country == 'China')")
        df['index_rank_score'] = df['index_rank']
        # 将index_rank列转为整形
        df['index_rank'] = df['index_rank'].astype(int)
    
        # 美国
        # df = df.query("(country == 'UnitedStates')|(country == 'USA')")
    
        #求topn名
        def topn(df):
            top = df.sort_values(['year','index_rank'],ascending = True)
            return top[:20].reset_index()
        df = df.groupby(by =['year']).apply(topn)
    
        # 更改列顺序
        df = df[['university','index_rank_score','index_rank','year']]
        # 重命名列
        df.rename (columns = {'university':'name','index_rank_score':'type','index_rank':'value','year':'date'},inplace = True)
    
        # 输出结果
        df.to_csv('university_ranking.csv',mode ='w',encoding='utf_8_sig', header=True, index=False)
        # index可以设置
    def main(year):
        for i in range(2005,year):
            html=get_one_page(i)
            tb=parse_on_page(html,i)
            save_csv(tb)
            print(i,'年排名提取完成完成')
            analysis()
    if __name__ == "__main__":
        main(2019)
    
    

    运行之后会有一个university_ranking.csv,部分内容如下:

    接下来就是可视化过程了。

    1、 首先,到作者的github主页:

    https://github.com/Jannchie/Historical-ranking-data-visualization-based-on-d3.js

    2、克隆仓库文件,使用git

    # 克隆项目仓库
    git clone https://github.com/Jannchie/Historical-ranking-data-visualization-based-on-d3.js
    # 切换到项目根目录
    cd Historical-ranking-data-visualization-based-on-d3.js
    # 安装依赖
    npm install
    

    这里如果git clone超时可参考:

    https://www.cnblogs.com/xiximayou/p/12305209.html

    需要注意的是,这里的npm是我之前装node.js装了的,没有的自己需要装以下。

    在执行npm install时会报错:

    先执行:

    npm init

    之后一直回车即可:

    再执行npm install

    任意浏览器打开 bargraph.html 网页,点击选择文件,然后选择前面输出的 university_ranking.csv 文件,看下效果:

    只能制作动图上传了。

    可以看到,有了大致的可视化效果,但还存在很多瑕疵,比如:表顺序颠倒了、字体不合适、配色太花哨等。可不可以修改呢?

    当然是可以的,只需要分别修改文件夹中这几个文件的参数就可以了:

    • config.js 全局设置各项功能的开关,比如配色、字体、文字名称、反转图表等等功能;
    • color.css 修改柱形图的配色;
    • stylesheet.css 具体修改配色、字体、文字名称等的css样式;
    • visual.js 更进一步的修改,比如图表的透明度等。

    知道在哪里修改了以后,那么,如何修改呢?很简单,只需要简单的几步就可以实现:

    • 打开网页, 右键-检查 ,箭头指向想要修改的元素,然后在右侧的css样式表里,双击各项参数修改参数,修改完元素就会发生变化,可以不断微调,直至满意为止。

    • 把参数复制到四个文件中对应的文件里并保存。
    • Git Bash运行 npm run build ,之后刷新网页就可以看到优化后的效果。(我发现这一步其实不需要,而且会报错,我直接修改config.js之后运行也成功了)

    这里我主要修改的是config.js的以下项:

      // 倒序,使得最短的条位于最上方 
      reverse: true,
      // 附加信息内容。
      // left label
      itemLabel: "本年度第一大学",
      // right label
      typeLabel: "世界排名",
      //为了避免名称重叠
      item_x: 500,
      // 时间标签坐标。建议x:1000 y:-50开始尝试,默认位置为x:null,y:null
      dateLabel_x: 1000,
      dateLabel_y: -50,
    

    最终效果:

    至此,就全部完成了。

    看起来简单,还是得要自己动手才行。

    源码获取加群:850591259

     

    展开全文
  • 网上搜了一下关于python绘制三维柱状图,没有找到可用的,偶然间发现一个第三方库pyecharts,不仅可以绘制三维图,还能动态展示,生成的是html文件。 中文文档地址:http://pyecharts.herokuapp.com/;github项目...

    当有数据想要进行横向纵向同步比较时,三维柱状图是最好的选择,目前基础的word和excel还不具备此功能,可以使用专业画图软件origin pro来做,python也是很多人首先想到的。网上搜了一下关于python绘制三维柱状图,没有找到可用的,偶然间发现一个第三方库pyecharts,不仅可以绘制三维图,还能动态展示,生成的是html文件。
    中文文档地址:http://pyecharts.herokuapp.com/github项目源码

    仅以下方数据示例,更复杂的操作请参看GitHub

    1. 原始数据


    我的原始数据都是按100算的,所以在函数中有用除以100计算,如果数据正好是1以内,可以不做除以100处理

    2. 代码

    import random
    from pyecharts.faker import Faker
    from pyecharts import options as opts
    from pyecharts.charts import Bar3D
    import pandas as pd
    import numpy as np
    def read_do():   #负责数据的读取和整理
        init_data=pd.read_excel(r"D:\python\pra\画图\青岛指标.xlsx")
        init_data=np.array(init_data)
        data_tip=['GDP增速','常住人口城镇化率','第二产业占GDP比重','第三产业占GDP比重','城市恩格尔系数','公园绿地建成区绿化覆盖率',
                  '居民消费价格指数','商品零售价格指数','工业生产者出厂价格指数']
        data_year=[2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018]
        data_pre=[]
    
        num=1
        N=0
        for st in data_tip:
            ofr=0
            for dy in data_year:
                fuck = [st,dy,float(init_data[ofr][num]/100)] # 原始数据做除以100处理,使其位于0-1之间
                data_pre.append(fuck)
                N = N+1
                ofr = ofr+1
            num = num+1
        return data_pre
    def bar3d_base() -> Bar3D:
        data = read_do()
        data_tip=['GDP增速','常住人口城镇化率','第二产业占GDP比重','第三产业占GDP比重','城市恩格尔系数','公园绿地建成区绿化覆盖率', '居民消费价格指数','商品零售价格指数','工业生产者出厂价格指数']
        data_year=[2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018]
        c = (
            Bar3D()
            .add(
                "",
                data,
                xaxis3d_opts = opts.Axis3DOpts(data_tip,type_="category",max_=9),
                yaxis3d_opts = opts.Axis3DOpts(data_year,type_="time",max_=2019),
                zaxis3d_opts = opts.Axis3DOpts(type_="value",max_=1), # 此处最大值为1,也可以自行设置,不过值过大颜色都是红色
                grid3d_opts = opts.Grid3DOpts(width="280",height="100")
            )
            .set_global_opts(
                visualmap_opts = opts.VisualMapOpts(max_=1),
                title_opts = opts.TitleOpts(title = "青岛指标"),
            
            )
        )
    
    
        return c
    abc = bar3d_base()
    abc.render("青岛指标.html")
    

    3. 结果

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    可以看到,图片左侧有一个颜色条,表示0-1的数值,故要将数据处理为0-1之间。
    可以旋转查看,是动态的。

    展开全文
  • 当有大量面板数据摆在我们面前时,使用一个三维的柱状图来进行数据分析是非常直观的;这里推荐pyecharts第三方库;中文文档地址:http://pyecharts.herokuapp.com/非常的好用; 这里我们的数据大概是这样的: 上...

    当有大量面板数据摆在我们面前时,使用一个三维的柱状图来进行数据分析是非常直观的;这里推荐pyecharts第三方库;中文文档地址:http://pyecharts.herokuapp.com/非常的好用;
    这里我们的数据大概是这样的:
    每一行代表一年,数据来源:中国进出口银行年报
    上代码:

    
    import random
    from pyecharts.faker import Faker
    from pyecharts import options as opts
    from pyecharts.charts import Bar3D
    import pandas as pd
    import numpy as np
    def read_do():   #负责数据的读取和整理
        init_data=pd.read_excel("data_6_15.xlsx")
        init_data=np.array(init_data)
        data_tip=["设备出口","船舶出口","高新技术产品","一般机电产品","对外承包工程","境外投资","农产品出口","其他"]
        data_year=[2006,2007,2008,2009,2010,2011,2012,2013,2014]
        data_pre=[]
    
        num=0
        N=0
        for st in data_tip:
            ofr=0
            for dy in data_year:
                fuck=[st,dy,float(init_data[ofr][num])]
                data_pre.append(fuck)
                N=N+1
                ofr=ofr+1
            num=num+1
        return data_pre
    def bar3d_base() -> Bar3D:
        data = read_do()
        data_tip=["设备出口","船舶出口","高新技术产品","一般机电产品","对外承包工程","境外投资","农产品出口","其他"]
        data_year=[2006,2007,2008,2009,2010,2011,2012,2013,2014]
        c = (
            Bar3D()
            .add(
                "",
                data,
                xaxis3d_opts=opts.Axis3DOpts(data_tip,type_="category",max_=8),
                yaxis3d_opts=opts.Axis3DOpts(data_year,type_="time",max_=2015),
                zaxis3d_opts=opts.Axis3DOpts(type_="value",max_=1),
                grid3d_opts=opts.Grid3DOpts(width="280",height="100")
            )
            .set_global_opts(
                visualmap_opts=opts.VisualMapOpts(max_=1),
                title_opts=opts.TitleOpts(title="按行业分的支持力度"),
            
            )
        )
    
    
        return c
    abc=bar3d_base()
    abc.render("index.html")
    

    会在代码脚本文件夹生成index.html文件,在浏览器打开;效果如下:

    水平有限画的比较粗糙,这个图可以用鼠标拖动旋转
    可恶的是还被垃圾甲方给否了;

    展开全文
  • Python】模块学习之matplotlib柱状图、饼状图、动态图及解决中文显示问题

    【Python】模块学习之matplotlib柱状图、饼状图、动态图及解决中文显示问题

    参考文章:

    (1)【Python】模块学习之matplotlib柱状图、饼状图、动态图及解决中文显示问题

    (2)https://www.cnblogs.com/Detector/p/8850280.html


    备忘一下。


    展开全文
  • python,可视化,html
  • 前言 通过数据绘图,我们可以将枯燥的数字转换成容易被人们接受的图表,从而让人留下更加深刻的印象。...通过 Matplotlib,可以仅需要几行代码,便可以生成绘图,直方,功率谱,条形,错误,散点,...
  • ()">饼图</button> ()">柱状图</button> ()">线形图</button> ()">雷达图</button> <br> <hr> </div> ;height:600px;"></div> <script type="text/javascript"> var myChart = echarts.init(document....
  • 今天给大家准备的是动态更新的动态图,上次在b站见到了,便想着来做,正好又在猪哥的公众号《裸睡的猪》看到了这个知识点,就马不停蹄的我就开始练习,下面是效果。 材料: python3 matplotlib 数据获取地址:...
  • python matplotlib 绘图

    2021-03-21 14:19:32
    python matplotlib 绘图。散点图、折线图、柱状图、直方图、图像属性(颜色,数据标记属性、线性属性)、子图、三维曲线图、三维散点图、三维曲面图、动态图。
  • 用pandas读取数据,通过整合数据格式,分别用pyecharts绘制地图、柱状图、饼图,具体内容如下: 1.绘制地图 importpyecharts.optionsasopts frompyecharts.globalsimportThemeType frompye...
  • 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作...用pandas读取数据,通过整合数据格式,分别用pyecharts绘制地图、柱状图、饼图,具体内容如下: 1.绘制地图 .
  • 数据可视化2.1 2019年各省市GDP柱状图(横向)2.2 2019年各省市GDP柱状图(纵向)2.3 2019年各省市GDP全国地图2.4 2001-2019年每年各省市GDP轮播图推荐阅读 大家好,我是欧K。 本期我们利用Python可视化动态展示2001-...

空空如也

空空如也

1 2 3 4
收藏数 66
精华内容 26
关键字:

python动态柱状图

python 订阅