数据科学库【matplotlib】
文章目录
- 数据科学库【matplotlib】
- 前言
- 一、数据分析介绍及环境安装
- 1.为什么要数据分析???
- 2.环境安装
- 二、matplotlib
- 1.为什么学习matplotlib???
- 2.绘制折线图
- 3.绘制散点图
- 3.绘制条形图
- 4.绘制直方图
- 5.更多绘图工具
前言
“花圃记录学习日常”。刚开始走上机器学习之路,以下都是入门基础内容的一些要点笔记。
一、数据分析介绍及环境安装
1.为什么要数据分析???
-》岗位要求
-》python数据科学的基础
-》机器学习的基础
数据分析实际上就是用适当的方法对收集来的大量数据进行分析,帮助人们作出判断,以便采取行动。
数据分析流程:
2.环境安装
conda环境安装
conda集成了很多平台用到的环境,conda可以非常容易的安装以往不好安装的模块,几乎百分之百可以成功。
我们说实际上一个项目是在一个环境中去做的,我们不是看项目指定什么,而是看我们做项目用到的环境,然后将环境进行requirments说明。
jupyter notebook:
实际上它是一款编程、文档、笔记、展示软件
二、matplotlib
1.为什么学习matplotlib???
-》数据的可视化,直观呈现
-》使得数据更加客观,更具有说服力
matplotlib是最为流行的 python底层绘图库,主要做数据可视化图表
,实际上名字就是取材于matlab,仿照matlab的实现。
2.绘制折线图
示例:
from matplotlib import pyplot as pltx=range(2,26,2)
y=[15,13,14.5,17,20,25,26,26,27,22,18,15]
plt.plot(x,y)
plt.show()
输出结果:
那么显然上述的图像所呈现的信息是不完整的,我们可以 do more!
1.设置图片大小(想要一个高清无码大图)
2.保存到本地
3.描述信息,比如x轴和y轴表示什么,这个图表示什么
4.调整x或者y的刻度的间距
5.线条的样式(比如颜色,透明度等)
6.标记出特殊的点(比如告诉别人最高点和最低点在哪里)
7.给图片添加一个水印(防伪,防止盗用)
from matplotlib import pyplot as pltx=range(2,26,2)
y=[15,13,14.5,17,20,25,26,26,27,22,18,15]# 设置图像的尺寸,figsize表示宽*高,dpi表示每英寸的像素点个数
plt.figure(figsize=(20,8),dpi=80)# 调整x,y刻度大小
# plt.xticks()要注意的是()传入的是什么范围以什么步长进行变化
# plt.xticks([i/2 for i in range(4,49)])
plt.xticks(range(2,25))
# plt.yticks()要注意的是()传入的是什么范围以什么步长进行变化,尤其是范围,一般y不是顺序大小,就需要用到min(y)与max(y)这样的函数,注意range()右端取不到
plt.yticks(range(min(y),max(y)+1))# 绘图
plt.plot(x,y)# 保存,保存要注意的是在绘图plot执行之后,注意./ 表示保存在当前目录下
# .png可以保存为 .svg矢量形式
plt.savefig("./savefig_1.png")#显示
# plt.show()
示例:
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")x=range(11,31)
y=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y_1=[1,0,3,1,2,2,3,3,2,1 ,2,1,1,1,1,1,1,1,1,1]plt.figure(figsize=(20,8),dpi=80)
plt.xticks(range(11,31,1),["{}岁".format(i) for i in range(11,31,1)][::1],fontproperties=my_font)
plt.yticks(range(0,9),["{}个".format(i) for i in range(0,9)],fontproperties=my_font)
plt.xlabel("年龄",fontproperties=my_font)
plt.ylabel("恋爱次数",fontproperties=my_font)
plt.title("恋爱走势",fontproperties=my_font)
plt.grid(alpha=0.5,linestyle=":") #alpha是透明度参数,1是不透明plt.plot(x,y,label="自己",color="r",linestyle=":",linewidth=2)
plt.plot(x,y_1,label="同桌",color="b",linestyle="--",linewidth=2)
plt.legend(prop=my_font,loc="best")
# best
# upper right
# upper left
# lower left
# lower right
# right
# center left
# center right
# lower center
# upper center
# center
plt.savefig("./save_2.png")
plt.grid(alpha=0.5,linestyle=":") #alpha是透明度参数,1是不透明plt.plot(x,y,label="自己",color="r",linestyle=":",linewidth=2)
plt.plot(x,y_1,label="同桌",color="b",linestyle="--",linewidth=2)
plt.legend(prop=my_font,loc="best")
plt.grid()是开启网格,其中参数alpha是表示网格透明度,1为不透明,linestyle为线形
plt.plot()中参数label是表示给图加入图例,color表示选取颜色,这里的颜色可以是一些常见英文单词,也可以去找颜色对应的十六进制码,linestyle线形,linewidth表示线宽
plt.legend(prop=my_font,loc=“best”)尤为注意,这其实与label对应的,加入图例后,设置中文格式表示,需要用它,注意其他地方的参数都是fontproperties等于我们的实例对象my_font,而这里是prop,后面的loc代表图例的位置,注释中右对应的字符
we have done!
绘制折线图(plt.plot)
设置了图片大小(plt.figure)
实现了图片保存(plt.saveflg)
设置了xy轴上的刻度和字符串(xticks)
解决了刻度稀疏和密集的问题(xticks)
【注意这里调整间距传入的参数是包含数字的可迭代对象】
【注意这里的添加字符串到轴上,需要的参数是与间距一一对应的另一个可迭代对象】
设置了标题,xy轴的lable(title,xlable,ylable)
设置了字体(font_manager. fontProperties,matplotlib.rc)
在一个图上绘制多个图形(plt多次plot即可)
为不同的图形添加图例
3.绘制散点图
matplotlib能够绘制折线图,散点图,柱状图,直方图,箱线图,饼图等(代码完全可以去找官方代码的demo)
示例:
from matplotlib import pyplot as plt
from matplotlib import font_managermy_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")y_3=[11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y_10=[26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]x_3=range(1,32)
x_10=range(41,72)#设置图片尺寸
plt.figure(figsize=(20,8),dpi=80)#设置刻度
_x=list(x_3)+list(x_10)
_x_labels=["3月{}日".format(i) for i in _x[:32]]+["10月{}日".format(i-40) for i in _x[33:]]
plt.xticks(_x[::3],_x_labels[::3],rotation=45,fontproperties=my_font)# 设置信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度",fontproperties=my_font)
plt.title("气温走势",fontproperties=my_font)# 绘图,并设置图例,格式
plt.scatter(x_3,y_3,label="3月份",linestyle=":",linewidths=2)
plt.scatter(x_10,y_10,label="10月份",linestyle=":",linewidths=2)
plt.legend(loc="upper left",prop=my_font)# 保存
plt.savefig("./save_3.png")
3.绘制条形图
示例:
# 绘制竖着的条形图
# 导入模块
from matplotlib import pyplot as plt
from matplotlib import font_manager# 实例化设置中文格式
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")# 数据
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]# 设置图片尺寸
plt.figure(figsize=(20,15),dpi=100)# 设置刻度
plt.xticks(range(len(a)),a,rotation=90,fontproperties=my_font)
plt.xlabel("电影",fontproperties=my_font)
plt.ylabel("票房(单位:亿元)",fontproperties=my_font)
plt.title("2017电影票房",fontproperties=my_font)# 打开网格
plt.grid(alpha=0.4)
# 绘图
plt.bar(range(len(a)),b,width=0.3,color="orange")
# 这里注意的是竖着的width表示的是条形的宽度,而横着的条形图是不同的# 保存
plt.savefig("./save_4.png")
# 绘制横着的条形图
# 导入模块
from matplotlib import pyplot as plt
from matplotlib import font_manager# 实例化设置中文格式
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")# 数据
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
# ------------------------与之前竖着的条形图基本相同----------------------------------------------
# 设置图片尺寸
plt.figure(figsize=(20,8),dpi=100)# 设置刻度
plt.yticks(range(len(a)),a,fontproperties=my_font)
# plt.ylabel("电影",fontproperties=my_font)
plt.xlabel("票房(单位:亿元)",fontproperties=my_font)
plt.title("2017电影票房",fontproperties=my_font)# 打开网格
plt.grid(alpha=0.4)
# 绘图
plt.barh(range(len(a)),b,height=0.3,color="orange")
# 这里注意的横着的条形图是height
# 这里用的函数是barh# 保存
plt.savefig("./save_4_1.png")
示例(绘制多个条形图):
# 绘制横着的条形图
# 导入模块
from matplotlib import pyplot as plt
from matplotlib import font_manager# 实例化设置中文格式
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")# 数据
a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]x_14=list(range(len(a)))
x_15=[i+0.2 for i in x_14]
x_16=[i+0.4 for i in x_14]# 设置图片尺寸
plt.figure(figsize=(20,8),dpi=100)# 设置刻度
plt.xticks(x_15,a,fontproperties=my_font)
plt.xlabel("电影",fontproperties=my_font)
plt.ylabel("票房",fontproperties=my_font)
plt.title("电影票房",fontproperties=my_font)# 打开网格
plt.grid(alpha=0.4)
# 绘图
plt.bar(x_14,b_14,label="2017年09月14日",width=0.2,color="orange")
plt.bar(x_15,b_15,label="2017年09月15日",width=0.2,color="blue")
plt.bar(x_16,b_16,label="2017年09月16日",width=0.2,color="green")# 设置图例
plt.legend(loc="upper right",prop=my_font)# 保存
plt.savefig("./save_5.png")
一次要绘制多个图在一起,比如之前的两个例子,散点图和上方的柱状图,那么这个时候,只需要调用多次相应的plt.scatter、plt.bar绘制命令,但相应的我要将横坐标进行移动不能重合,也要注意宽度的问题。
以plt.bar(x,y)为例子,实际上,这里面的x,y确实是可迭代的对象,只是数量,取什么x对应什么y
而已,那么把握整个x轴或y轴的是plt.xstick与plt.xstick
也就是说我设置好了一个取值步长,范围,我只需要将其余的做相同的步长,但每个x都平移以至不与之重合。
4.绘制直方图
示例:
from matplotlib import pyplot as plt
from matplotlib import font_managermy_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")a=[131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114,119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99,136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144,105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123,117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116,108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125,138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107,143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123,116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111,100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149,122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114,133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110,137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94,146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]plt.figure(figsize=(20,8),dpi=100)bin_width=3
num_bin=(max(a)-min(a))//bin_widthplt.grid(alpha=0.8)
plt.xticks(range(min(a),max(a)+bin_width,bin_width))
# plt.hist(a,num_bin)plt.hist(a,num_bin,density=True)
# 这里是绘制频率直方图,注意的是,新的matplotlib中density=True,代替了norms=Trueplt.savefig("./save_6.png")
绘制直方图,这里可能会有疑问说,直方图与条形图长得一样,不是一个东西吗???事实上,长得确实一样,但表示表示的内容确实相差的,条形图表示的内容是离散的什么是离散的呢,就比如说是电影、水果等这些种类问题,而直方图表示的连续的量,比如说是时间、距离。
在直方图的绘制方法中我们调用的是plt.hist,这其中的参数是我们需要停机的序列即数据,要将这些数据分成几组,调用会自动的生成我们的纵轴,后面加上一个参数(新版matplotlib)是density=True,即可绘制频率直方图。
示例:
这个例子可以绘制成直方图吗???显然是不可以的,题目中的数据已经是完成统计之后的了,那么我们就没办法调用hist去生成,因为hist我们使用的是原始的数据,当然,事实上我们可以调整条形图让我们的统计结果变成神似直方图的图形。
from matplotlib import pyplot as plt
from matplotlib import font_managermy_font=font_manager.FontProperties(fname="C:/Windows/Fonts/msyh.ttc")interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]plt.figure(figsize=(20,8),dpi=100)_x=[i-0.5 for i in range(len(interval)+1)]
_x_labels=interval+[150]plt.xticks(_x,_x_labels)
plt.bar(range(len(interval)),quantity,width=1)plt.grid(alpha=0.5)plt.savefig("./save_7.png")
5.更多绘图工具
matplotlib使用流程
明确问题
选择图形的呈现方式
准备数据
绘图和图形完善
后期就是利用我们的numpy和pandas去处理数据,获取数据,然后matpkotlib去数据可视化,但实际上它用的并不是很多,百度ECharts等前端的绘图工具也是很多的。
应该选择那种图形来呈现数据
matplotlib.plot(x,y)
matplotlib.bar(x,y)
matplotlib.scatter(x,y)
matplotlib.hist(data,bins,normed)
xticks和yticks的设置
label和titile,grid的设置
绘图的大小和保存图片
plotly:可视化工具中的github,相比于matplotlib更加简单,图形更加漂亮,同时兼容matplotlib和pandas
使用用法:简单,照着文档写即可
文档地址: https://plot.ly/python/