豆瓣电影Top250爬取的数据的一些简单可视化笔记
2016-05-19 20:23
711 查看
豆瓣Top250网址
将之前爬取到的豆瓣电影进行简单的可视化:
数据列表保存为CSV格式,如图
豆瓣电影Top250评分的分布饼图:
电影出品年的分布饼图:
豆瓣电影Top250,电影排名&评价人数&电影评分的散点图:
这张图比较有意思:
1)评价人数比较少的电影,评分往往要高点(排除前面口碑爆棚的几部),可能因为评价的样本不够,分数会偏高。所以评价人数多的更客观。
2)豆瓣的排名看来是按评价人数和评分加权排名的.找到了豆瓣排序算法的一些介绍,然而并没有介绍具体公式,链接豆瓣算法
3)前面几部看来真的经典到不行。
前10名:肖申克的救赎
这个杀手不太冷
阿甘正传
霸王别姬
美丽人生
千与千寻
辛德勒的名单
海上钢琴师
机器人总动员
盗梦空间
泰坦尼克号
(千与千寻还没看过。。。)
按电影国家分类:
因为有些影片为多国合作的,也算各自国家的吧。
过滤了很多只有一两部的国家,果然还是美帝有金坷垃,亩产一万八
影片类型分布柱状图:
这里的剧情类基本大多数影片都算,定义很不清晰。
看来还是爱情属性最能引起观众的共鸣,听得最多的也是情歌
还发现简书上一个教程点击Jupyter画图交互,在命令行直接输入%pylab inline直接显示在notebook中,不会产生新的Ipyhon窗口,对中文的支持很好。不过好像没法保存,当草稿打。
将之前爬取到的豆瓣电影进行简单的可视化:
数据列表保存为CSV格式,如图
#!-*- coding:utf-8 -*- import pandas as pd import numpy as np import matplotlib.pylab as plt import re from numpy import rank from builtins import map from datashape.coretypes import Map #http://www.jianshu.com/p/0a76c94e9db7 参考了简书上的饼状图教程 #切换工作目录,IPython运行%pylab Movie=pd.read_csv('MovieTop250.csv') #数据读取 #Rating pie Rating=Movie['Rating10'] bins=[8,8.5,9,9.5,10] #分区(0,8],(8,8.5].... rat_cut=pd.cut(Rating,bins=bins) rat_class=rat_cut.value_counts() #统计区间个数 rat_pct=rat_class/rat_class.sum()*100 #计算百分比 rat_arr_pct=np.array(rat_pct)#将series格式转成array,为了避免pie中出现name f1=plt.figure(figsize=(9,9)) plt.title('DoubanMovieTop250\nRatingDistributin(0~10)') plt.pie(rat_arr_pct,labels=rat_pct.index,colors=['r','g','b','c'],autopct='%.2f%%',startangle=75,explode=[0.05]*4) #autopct属性显示百分比的值 plt.savefig('MovieTop250.RatingDistributin(0~10).png') f1.show() #explode:将某部分爆炸出来, 使用括号,将第一块分割出来,数值的大小是分割出来的与其他两块的间隙 #labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置 #autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数 #shadow,饼是否有阴影 #startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看 #pctdistance,百分比的text离圆心的距离 #patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本
豆瓣电影Top250评分的分布饼图:
#year pie year=Movie['Year'] for i in year.index: if len(year[i])>4: year.drop(i,inplace=True) # year.drop(i,inplace=True) 去除多个年代的特例,inplace重要,修改改变原值 year=year.astype(int) bins=np.linspace(min(year)-1,max(year)+1,10).astype(int) #产生区间,bins一般为(,]的,所以+1 year_cut=pd.cut(year,bins=bins) year_class=year_cut.value_counts() year_pct=year_class/year_class.sum()*100 year_arr_pct=np.array(year_pct) color=['b', 'g', 'r', 'c', 'm', 'y', (0.2,0.5,0.7), (0.6,0.5,0.7),(0.2,0.7,0.1)] #RGB 0-1之间的tuple f2=plt.figure(figsize=(9,9)) patches,out_text,in_text=plt.pie(year_arr_pct,labels=year_pct.index,colors=color,autopct='%.2f%%',explode=[0.05]*9,startangle=30) plt.title('MovieTop250\nYears Distribution') f2.show() plt.savefig('MovieTop250_YearsDistribution.png')
电影出品年的分布饼图:
#评价人数 rank=np.array(Movie.index,dtype=int)+1 #index start from 0 Movie['rank']=rank f3=plt.figure(3,figsize=(12,10)) plt.scatter(x=Movie['rank'],y=Movie['RatingNum'],c=Movie['Rating10'],s=80) plt.title('Douban Movie\nRank and Rating People by Rating',fontsize=20) plt.xlabel('Rank',fontsize=15) plt.ylabel('Rating People',fontsize=15) plt.axis([-5,255,0,750000]) #x轴坐标范围 plt.colorbar() #显示colorbar plt.savefig('DoubanMovie_Rank_and_RatingPeople_by_Rating.png') plt.show()
豆瓣电影Top250,电影排名&评价人数&电影评分的散点图:
这张图比较有意思:
1)评价人数比较少的电影,评分往往要高点(排除前面口碑爆棚的几部),可能因为评价的样本不够,分数会偏高。所以评价人数多的更客观。
2)豆瓣的排名看来是按评价人数和评分加权排名的.找到了豆瓣排序算法的一些介绍,然而并没有介绍具体公式,链接豆瓣算法
3)前面几部看来真的经典到不行。
前10名:肖申克的救赎
这个杀手不太冷
阿甘正传
霸王别姬
美丽人生
千与千寻
辛德勒的名单
海上钢琴师
机器人总动员
盗梦空间
泰坦尼克号
(千与千寻还没看过。。。)
按电影国家分类:
#!-*- coding:utf-8 -*- import pandas as pd import numpy as np import matplotlib.pylab as plt from matplotlib.font_manager import FontProperties #fontproperties的模块,pyde自动添加的,好评 Movie=pd.read_csv('MovieTop250.csv',encoding='utf-8') country_iter=(set(x.split(' ')) for x in Movie['Country']) #generator生成器,分解字符串 countries=sorted(set.union(*country_iter)) #Return the union of sets as a new set. #*country_iter:This works for any iterable of iterables. df=pd.DataFrame(np.zeros((len(Movie),len(countries))),columns=countries)#创建一个0DataFrame,np.zeros()内为要tuple for i,gen in enumerate(Movie['Country']): df.ix[i,gen.split(' ')]=1 #第i条数据的country置为1 num_of_country=df.sum() num_of_country[1]=num_of_country[0]+num_of_country[1] #中国和中国大陆合并 num_of_country.pop('中国') num_of_country.sort_values(inplace=True,ascending=False) f1=plt.figure() for i,gen in enumerate(num_of_country[:10]): plt.bar(i,gen) #i为bar的起始横坐标,gen为纵坐标,宽度默认 names=list(num_of_country.index) plt.xticks(np.arange(10)+0.4,names,fontproperties='SimHei') #在图中显示中文字符要加上fontproperties='SimHei' plt.ylabel('Movie Number') plt.title('Douban Movie\nMovie Distribution by Countries') plt.savefig('Movie_Distribution_by_Countries.png') f1.show() 国家分布的柱状图:
因为有些影片为多国合作的,也算各自国家的吧。
过滤了很多只有一两部的国家,果然还是美帝有金坷垃,亩产一万八
genre_iter=(set(x.split(' ')) for x in Movie['Grenre']) genre=sorted(set.union(*genre_iter)) frame=pd.DataFrame(np.zeros((len(Movie),len(genre))),columns=genre) for i,gen in enumerate(Movie['Grenre']): frame.ix[i,gen.split(' ')]=1 genre_sum=frame.sum() genre_sum.sort_values(inplace=True,ascending=False) f2=plt.figure(2) '''for i,gen in enumerate(genre_sum[:8]): plt.bar(i,gen) names=list(genre_sum.index) plt.xticks(np.arange(8)+0.4,names,fontproperties='SimHei') plt.show()''' #改进的方法 p2=plt.bar(np.arange(8),genre_sum.values[:8],align='center') #p2包含8个元素,每个对应一个bar names=list(genre_sum.index) plt.xticks(np.arange(8),names,fontproperties='SimHei') plt.legend((p2[0],),('MovieNumber',)) #只有一个元素的tuple应写成(ele,) plt.ylabel('Movie Number') plt.title('Douban Movie\nDistribution by Genre') plt.savefig('Movie_Distribution_by_Genre.png') plt.show()
影片类型分布柱状图:
这里的剧情类基本大多数影片都算,定义很不清晰。
看来还是爱情属性最能引起观众的共鸣,听得最多的也是情歌
还发现简书上一个教程点击Jupyter画图交互,在命令行直接输入%pylab inline直接显示在notebook中,不会产生新的Ipyhon窗口,对中文的支持很好。不过好像没法保存,当草稿打。
相关文章推荐
- 【VC图像处理】 图像水平镜像,垂直镜像,图像转置
- OpenCV3读取视频或摄像头
- Linux操作系统基础解析之(二)——操作系统由来
- 数据密集型系统架构设计
- MES机器数据维护
- Linux头文件库文件搜索路径
- 【Supervisor】Linux 后台进程管理利器
- java读properties的通用类,兼容linux和windows
- CentOS7安装iptables防火墙
- Dockerfile最佳实践(二)
- Apache Oozie - the workflow scheduler for hadoop
- Linux进程管理与调度-之-目录导航
- 每天一个Linux命令(21)find命令_xargs参数
- 推荐的编程网站
- Tomcat配置远程调试端口
- Ubuntu安装OpenGL开发环境
- CentOS 6.5/6.6 安装mysql 5.7 最完整版教程
- Dockerfile最佳实践(一)
- Python和shell中Base64编码使用那些事
- Python和shell中Base64编码使用那些事