Python可视化: D3.js呈现的大学排行榜

2018-12-13  本文已影响31人  泡泡坪

最近在公众号看到用python呈现,新中国成立后各省GDP的发展历程,于是照葫芦画瓢也写了一个,用的最多的应该是用大佬造的轮子,基于D3.js的数据可视化项目。
附上大佬的GitHub地址,有兴趣的小伙伴可以自行去围观
https://github.com/Jannchie/Historical-ranking-data-visualization-based-on-d3.js
这是作者的B站主页,发现了更多有意思的动态视频:


这些作品的作者是:@Jannchie见齐,他的主页:https://space.bilibili.com/1850091/#/video
实现这种效果的关键点是要有数据。观察一下上面的作品可以看到,横向柱状图中的数据要满足两个条件:一是要有多个对比的对象,二是要在时间上连续。这样才可以做出动态效果来。

数据来源

http://www.zuihaodaxue.com/ARWU2018.html


只需要for循环改变网址年份即可循环抓取数据
数据
def getData(year):
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:63.0) Gecko/20100101 Firefox/63.0'}
    url = 'http://www.zuihaodaxue.com/ARWU%s.html' % (str(year))
    response = requests.get(url,headers = headers)
    if response.status_code == 200:
        return response.content
    return None

def parseData(html, year):
    df = pd.read_html(html)[0]
    result = df.drop(df.columns[[2,3,5]], axis = 1)
    result.columns = ['world rank','university','score']
    result.fillna(0,inplace = True)
    result['index_rank'] = result.index.astype(int) + 1
    result['year'] = year
    result['country'] = get_country(html)
    return result

但是国家地区一栏是空的,所以我们得另想办法



可以看到国家是用英文表示的,这里得需要用Beautiful配合正则提取出国家名

def get_country(html):
    soup = BeautifulSoup(html,'html.parser')
    countries = soup.select('td > a > img')

    lst = []
    for i in countries:
        src = i['src']
        req = 'flag.*\/(.*?).png'
        country = re.findall(req, src)[0]
        lst.append(country)
    return lst
最终数据图
根据作者的那个框架的要求,把数据整理成以下作为D3.js的导入文件

到作者的github主页:
https://github.com/Jannchie/Historical-ranking-data-visualization-based-on-d3.js
下载他的项目
关于这个项目的教程
https://www.bilibili.com/video/av28087807
最终完成图如下
上一篇下一篇

猜你喜欢

热点阅读