@[toc]
前提工作
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore') # 去掉警告
plt.rcParams['font.sans-serif'] = ['SimHei'] # 确保中文正常显示
plt.rcParams['axes.unicode_minus'] = False # 确保负号正常显示
df = pd.read_excel(r'D:\数据分析\movie_data3.xlsx')
twinx() —— 双轴图(折线图+柱状图)的绘制
所谓双轴图,其实就是双y轴图,即一个图有两个y轴。
既然y轴都有两个了,理所当然双轴图中的图也有两个。一个图定位坐标时看左边y轴,另一个看右边y轴。
双轴图并不固定里面两个图的类型,可以 折线图+柱状图 ,也可以 两个折线图,随心所欲。目前双轴图支持的展示类型柱形图、折线图、堆积柱形图、面积图这四类图表样式。
不过一般来说是 折线图+柱状图。
要实现双轴操作,就要用到 twinx()
函数了。
根据电影评分绘制电影数量和评分的频率分布双轴图
- x轴:评分
- 图左边的y轴:表示电影数量
- 图右边的y轴:表示概率分布
生成概率密度函数,需要导包
from scipy.stats import norm
fig = plt.figure(figsize = (10,8))
# 1.生成频率分布直方图
ax1 = fig.add_subplot(111)
n,bins,patches = ax1.hist(df['评分'],bins = 100,alpha = 0.7)
ax1.set_xlabel('评分',fontsize = 15)
ax1.set_ylabel('电影数量',fontsize = 15)
ax1.set_title('频率分布图',fontsize = 20)
# 2.生成绘制曲线图用的正态分布概率密度函数
# scipy.stats.norm函数 : 可以实现正态分布
# pdf函数 : 生成概率密度函数(概率论学的那)
# 上面两个合起来 norm.pdf : 生成正态分布概率密度函数
# 此时我们需要一个均值(μ)为评分的均值,方差(σ²)为评分的标准差这样一个正态分布概率密度函数
y = norm.pdf(bins,df['评分'].mean(),df['评分'].std())
# 第一个参数是前面hist函数的返回值 第二个参数:均值 第三个参数:方差
# 3.生成曲线图
ax2 = ax1.twinx() # ax2与ax1共用一个x轴
ax2.plot(bins,y,'y--') # 为了打造双轴图,就得把y绘制到图形中
ax2.set_ylabel('评分的概率分布',fontsize = 15)
PS:这看起来怪麻烦,其实不然,只是举的这个例子难了,因为曲线是拿正态分布概率密度函数画的。概率论学的。
简单来说,双轴图画法就是在画两个图的基础上加上了 twinx()
操作。即,一个图上画两种图案,这两两个图案用 twinx()
联系起来。这样好理解多了。
plt.scatter() —— 散点图的绘制
用两组数据
构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
散点图将序列显示为一组点。值由点在图表中的位置表示。类别由图表中的不同标记表示。散点图通常用于比较跨类别的聚合数据。
根据电影时长和电影评分绘制散点图
x = df.时长
y = df.评分
plt.figure(figsize = (10,8))
plt.scatter(x,y)
plt.title('电影时长与评分的散点图',fontsize = 20)
plt.xlabel('时长',fontsize = 18)
plt.ylabel('时长',fontsize = 18)
plt.tick_params(labelsize = 14) # 坐标轴上字体大小
这样绘制的图有个问题,由于数据量过大,所以画出来的图非常冗余难看。
改进:
提取原有数据的 百分之一
x = df.时长[::100]
y = df.评分[::100]
只需把 x,y 数据每隔 100 个提取一次即可,这样就能得到原有数据的 百分之一
下面的代码不变
绘制图形时,在 plt.scatter() 中还可以加color参数设置点的颜色和 maker
参数设置点的 形状
。
marker 属性:
设置散点的形状
marker | 形状 | |
---|---|---|
'.' | 点 | |
',' | 像素点 | |
'o' | 圈 | |
'v' | 倒三角点 | |
'^' | 上三角点 | |
'<' | 左三角点 | |
'>' | 右三角点 | |
'1' | 下三叉点 | |
'2' | 上三叉点 | |
'3' | 左三叉点 | |
'4' | 右三叉点 | |
'8' | 八角形点 | |
's' | 正方形点 | |
'p' | 五角点 | |
'*' | 星星点 | |
'h' | 六边形点1 | |
'H' | 六边形点2 | |
'+' | 加号点 | |
'x' | 乘号点 | |
'D' | 钻石 | |
'd' | 细钻 | |
'\ | ' | v线 |
'_' | H线 |
绘图时就利用marker属性设置散点形状
plt.scatter(x,y,color = 'b',marker = 'D')
plt.boxplot() —— 箱形图的绘制
箱型图是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较。箱线图的绘制方式是:先找出一组数据的中位数、两个四分位数、上下边缘线;然后,连接两个四分位数画出箱子;再将上下边缘线与箱子连接,中位数在箱子中间。
plt.boxplot()
的参数:
x
:指定要绘制箱形图的数据。sym
:指定异常的形状,默认为 +号 显示。labels
:图例,添加标签。whis
:指定上下须与上下四分位的位置,默认为1.5倍的四分位差。指定异常值的范围,大代表宽松;小代表,紧。flierprops
:设置异常值的属性,如异常点的形状、大小、填充色等。notch
:是否是凹⼝的形式展现箱线图,默认⾮凹⼝。vert
:箱形图如何摆放,横着还是竖着,默认垂直摆放。positions
:指定箱线图的位置,默认为[0,1,2…]。widths
:指定箱线图的宽度,默认为0。patch_artist
:是否填充箱体的颜⾊。meanline
:是否用线的形式表示均值,默认用点来表示。meanprops
:设置均值的属性,如点的⼤⼩、颜⾊等。capprops
:设置箱线图顶端和末端线条的属性,如颜⾊、粗细等。whiskerprops
:设置须的属性,如颜⾊、粗细、线的类型等。- ...
美国电影评分的箱形图
plt.figure(figsize = (10,6))
plt.boxplot(data,whis = 2,flierprops = {'marker':'o','markerfacecolor':'r','color':'k'},patch_artist = True,boxprops = {'color':'k','facecolor':'#9999ff'})
# flierprops —— 异常值属性设置。 markerfacecolor 填充色 color 边框线 patch_artist 箱体颜色是否能修改
# boxprops —— 填充箱体颜色。 color 外边框线 facecolor 填充色
plt.title('美国电影评分',fontsize = 20)
plt.show()
多组数据的箱形图
把多个数据都放在一个箱形图中,进行并列展示,然后进行各种数据间的比较。
data1 = df[df.产地 == '中国大陆']['评分']
data2 = df[df.产地 == '日本']['评分']
data3 = df[df.产地 == '中国香港']['评分']
data4 = df[df.产地 == '英国']['评分']
data5 = df[df.产地 == '法国']['评分']
plt.figure(figsize = (12,8))
plt.boxplot([data1,data2,data3,data4,data5],labels = ['中国大陆','日本','中国香港','英国','法国'],whis = 2,flierprops = {'marker':'o','markerfacecolor':'r','color':'k'},patch_artist = True,boxprops = {'color':'k','facecolor':'#9999ff'})
plt.title('电影评分',fontsize = 20)
plt.tick_params(labelsize = 14) # 坐标轴上字体大小
# 设置坐标轴的颜色
ax = plt.gca() # gca : 得到当前的坐标系
ax.patch.set_facecolor('gray')
ax.patch.set_alpha(0.2)
plt.show()
通过 vert
属性可以把图旋转
构造箱形图时,plt.boxplot
中加个 vert
属性即可
plt.boxplot([data1,data2,data3,data4,data5],vert = False,labels = ['中国大陆','日本','中国香港','英国','法国'],whis = 2,flierprops = {'marker':'o','markerfacecolor':'r','color':'k'},patch_artist = True,boxprops = {'color':'k','facecolor':'#9999ff'})
其他代码不变
seaborn.heatmap() —— 热力图(相关系数矩阵图)
seaborn 是一个精简的python库,可以创建具有统计意义的图表,能理解pandas的DataFrame类型。
seaborn.heatmap
参数:
(1)热力图输入数据参数:
- data :矩阵数据集,可以是numpy的数组(array),也可以是pandas的DataFrame。如果是DataFrame,则 df 的 index/column 信息会分别对应到 heatmap 的 columns 和 rows,即 pt.index 是热力图的行标,pt.columns 是热力图的列标。
(2)热力图矩阵块颜色参数:
- vmax,vmin :分别是热力图的颜色取值最大和最小范围,默认是根据data数据表里的取值确定。
- cmap :从数字到色彩空间的映射,取值是 matplotlib 包里的 colormap 名称或颜色对象,或者表示颜色的列表。
- center :改参数默认值。如果数据表取值有差异时,设置热力图的色彩中心对齐值;能调整生成的图像颜色的整体深浅;设置 center 数据时,如果有数据溢出,则手动设置的 vmax、vmin 会自动改变 robust,默认为False。
(3)热力图矩阵块注释参数:
- annot :默认False。如果是True,在热力图每个方格写入数据;如果是矩阵,在热力图每个方格写入该矩阵对应位置数据。
- fmt :字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字。
- annot_kws :默认False。如果是True,设置热力图矩阵上数字的大小颜色字体,matplotlib包text类下的字体设置。
(4)热力图矩阵块之间间隔及间隔线参数:
- linewidths :定义热力图里 “标识两两特征关系的矩阵小块”之间的间隔大小。
- linecolor :切分热力图上每个小块的线的颜色,默认值是 'white'。
(5)热力图颜色刻度条参数:
cbar :是否在热力图侧边绘制颜色刻度条,默认是True。
- cbar_kws :热力图侧边绘制颜色刻度条时,相关字体设置,默认值是None。
- cbar_ax :热力图侧边绘制颜色刻度条时,刻度条位置设置,默认值是None。
求投票人数,评分,时长 ,这三个属性间的相关系数矩阵图
# 把这三列取出来
data = df[['投票人数','评分','时长']]
先导入:
import seaborn as sns
求参数:
corr = data.corr() # 求相关系数
corr = abs(corr) # 不想考虑正相关还是负相关,只想考虑相关程度
绘图:
fig = plt.figure(figsize = (10,8))
ax = fig.add_subplot(1,1,1)
ax = sns.heatmap(corr,annot = True,annot_kws = {'size':13,'weight':'bold'},linewidths = 0.05)
plt.xticks(fontsize = 15) # 设置x轴字体大小
plt.yticks(fontsize = 15) # 设置y轴字体大小
# 等同于
# plt.tick_params(labelsize = 14) # 坐标轴上字体大小
pandas 本身也封装了画图函数
我们可以画出各个属性之间的散点图,对角线是分布图
data = df[['投票人数','评分','时长']]
%pylab inline
result = pd.plotting.scatter_matrix(data[::100],diagonal = 'kde',color = 'k',alpha = 0.2,figsize = (10,10))
# diagonal 对角线设置
夹带私货
各电影评价人数柱状图
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore') # 去掉警告
plt.rcParams['font.sans-serif'] = ['SimHei'] # 确保中文正常显示
plt.rcParams['axes.unicode_minus'] = False # 确保负号正常显示
# 各电影评价人数柱状图
df = pd.read_csv(r'D:\pro1\实战案例\douban.csv')
df = df[['片名', '评价人数']]
plt.figure(figsize=(10, 6))
plt.bar(df.片名, df.评价人数)
plt.title('各电影评价人数', fontsize=20) # 设置图的标题(fontsize是字体大小)
plt.xlabel('电影', fontsize=18) # x轴名字
plt.ylabel('评价人数', fontsize=18) # y轴名字
plt.tick_params(labelsize=12) # 坐标轴上字体大小
plt.xticks(rotation=90) # 把字旋转多少度。x轴上的字都挤在一起了,把字竖着写
# 把数字显示在柱上(每个柱子都显示就得用循环)
for a, b in zip(df.片名, df.评价人数):
plt.text(a, b + 30000, b, ha='center', fontsize=10, va='bottom')
plt.show()
各电影评价人数和评分情况双轴图
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore') # 去掉警告
plt.rcParams['font.sans-serif'] = ['SimHei'] # 确保中文正常显示
plt.rcParams['axes.unicode_minus'] = False # 确保负号正常显示
# 各电影评价人数和评分情况双轴图
df = pd.read_csv(r'D:\pro1\实战案例\douban.csv')
df = df[['片名', '评价人数', '评分']]
fig = plt.figure(figsize=(10, 6))
ax1 = fig.add_subplot(111)
ax1.bar(df.片名, df.评价人数, alpha=0.7)
ax1.set_title('各电影评价人数和评分情况', fontsize=20) # 设置图的标题(fontsize是字体大小)
ax1.set_xlabel('电影', fontsize=18) # x轴名字
ax1.set_ylabel('评价人数', fontsize=18) # y轴名字
ax1.tick_params(labelsize=14) # 坐标轴上字体大小
plt.xticks(rotation=90) # 把字旋转多少度。x轴上的字都挤在一起了,把字竖着写
ax2 = ax1.twinx()
ax2.plot(df.片名, df.评分, 'y')
ax2.set_ylabel('评分', fontsize=18)
plt.show()
总结
暑假在家里花了一个星期时间,把numpy、pandas和matplotlib这三个数据分析库做了个大致的了解,目前对于Python数据分析的学习暂时告一段落了。接下来一段时间要继续Java的学习,并且在6月底吧,开始学数学建模的一些算法,因为听说学校会在6月底给参加建模的学生培训。
学到这里时其实挺感慨的,因为这个暑假是我人生中唯一一个开始认真学习的假期,哪怕是高二的暑假,我也没有像现在这样努力。每天早上8点坐到书桌上,一坐就是晚上12点或1点,目前已经坚持一个星期了,因为暑假才放了一个星期嘛哈哈。真不可思议,我现在能克制住所有欲望在假期里专注学习,这是我之前任何时候都不敢想的,希望一直保持下去吧。如果这个暑假每一天都能利用好,我相信我距离大厂又会更进一步。
还有一点让我欣慰,就是之前一个大佬,我就直接指名道姓吧哈哈,就是铁甲小宝大佬帮助我面试讲师的时候,给了我一些他的项目,其中有爬虫和豆瓣影评可视化。当时我看了这些项目时,表示啥也看不懂,但为了能面试上某教育机构的讲师,我硬着头皮说这些是我做的项目。彼时,我连Python基础都不好,连个简单的管理系统都写不出来,更别提会这些了,我连听都没听说过!还记得他跟我说爬虫的时候,我还以为他在逗我,我根本想不到爬虫竟然是一个技术的名字,我还反复跟他确认那个项目叫啥?叫爬虫?离谱的名字! 额额 现在看之前的自己太蠢了。现在算是今非昔比了,爬虫项目我早就做了,豆瓣影评可视化就是上面的“夹带私货” 哈哈。我用了不同的方法做的,并且也对图做了一些改进,肯定要比他给我的要好看许多了,哈哈并没有说大佬不好的意思。
我也在慢慢进步,从最早的3月份小菜鸡,到现在6月份小菜鸟,进行了从鸡到鸟的飞翔蜕变。哈哈开玩笑的。3个月时间,我学了不少东西,不过这是次要的。最重要的是3个月时间,让我对于未来不再迷茫了,至少不会像之前那样不知道该干啥。
努力坚持住,目前大二暑假,还有两年毕业,这两年利用好,我今后的人生可能都会变得不一样,加油吧骚年!
现在凌晨快1点了,属实是网易云时间到了,不能再写这有的没的了,明天还要继续干活呢,下播了兄弟们!