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
最终完成图如下