matplotlib学习笔记
1. 数据分析介绍
1.1 什么是数据分析:
数据分析是用适当的方式对收集来的大量数据进行分析,帮助人们作出判断,以便采取适当行动。
把大量的数据进行统计和整理,得出结论,为后续的决策提供数据支持。
1.2 数据分析的流程
2. matplotlib
为什么要学习matplotlib
- 能将数据进行可视化,更直观的呈现。
- 使数据更加客观、更具说服力。
matplotlib安装:
命令行:python -m pip install -U pip setuptools
python -m pip install matplotlib
2.1 什么是matplotlib
matplotlib:最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建。
2.2 matplotlib基本要点
把坐标连成线,组成一个折线图。
from matplotlib import pyplot as plt → 导入pyplot
plt.plot(x,y) → 传入x和y,通过plot绘制出折线图
plt.show() → 在执行程序时展示图形
设置图片大小
import matplotlib.pyplot as plt
fit = plt.figure(figsize=(20,8),dpi=80)
→figure图形图标的意思,在这里指的是我们画的图
→通过实例化一个figure并且传递参数,能够在后台自动使用该figure实例
→在图像模糊的时候可以传入dpi参数,让图片更加清晰
plt.savefig("./sig_size.png") → 保存图片
→可以保存为svg这种矢量图格式,放大不会有锯齿
显示中文:
- matplotlib.rc
- font_manager
- from matplotlib import font_manager
- my_font = font_manager.FontPropertier(fname="")
- 使用:要显示中文的地方添加fontproperties=my_font
图例中使用prop=my_font来接收
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 解决显示中文的问题
my_font = font_manager.FontPropertier(fname="字体路径")
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
#设置图片大小
plt.figure(figsize=(20,8),dpi=80)
# 绘图
plt.plot(x,y)
# 设置x轴的刻度
# 间隔为2
# plt.xticks(range(2,25,2))
# 间隔为1.5
# 当刻度太密集时候使用列表的步长(间隔取值)来解决
_xtick_labels = [i/2 for i in range(4,49)]
plt.xticks(_xtick_labels[::3])
# 绘制网格
plt.grid(alpha=0.1) #alpha表示透明度
# 添加描述信息
plt.xlable("横坐标")
plt.ylable("纵坐标")
plt.title("标题")
# 保存
#plt.savefig("./testo1.png")
# 展示图形
plt.show()
plt.xticks(x[::5],_x_ticks[::5],rotation=90)
→两数组长度必须一样,否则不能完全覆盖整个轴
→rotation选项,让字符串旋转90°显示
自定义绘制图像的风格:
在绘制的时候指定即可:
- color=‘r', #线条颜色
- linestyle=’--‘,# 线条风格
- linewidth=5, # 线条粗细
- alpha=0.5,# 透明度
from matplotlib import pyplot as plt
def huitu():
y_1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1];
y_2 = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1];
x = range(11,31)
#设置图片大小
plt.figure(figsize=(20,8),dpi=80)
# 绘图
plt.plot(x,y_1,label="my",color="orange",linestyle=':')
plt.plot(x,y_2,label="you",colir="cyan",linestyle="--")
# 设置x轴的刻度
_xtick_labels = [ x]
plt.xticks(x,_xtick_labels)
# 绘制网格
plt.grid(alpha=0.4)
# 展示图形
plt.show()
return None
if __name__ == "__main__":
huitu()
总结:前面做了什么:
- 绘制了折线图(plt.plot)
- 设置图片的大小和分辨率(plt.figure)
- 实现了图片的保存(plt.savefig)
- 设置了xy轴上的刻度和字符串(xticks)
- 解决了刻度稀疏和密集的问题(xticks)
- 设置了标题,xy轴的lable(title,xlable,ylable)
- 设置了字体(font,manager,fontProperties,matplotilb.rc)
- 在一个图上绘制多个图形(plt多次plot即可)
- 为不同的图形添加图例
以上统统很重要
画其他图形的话,去看matplotlib官方文档
2.3 matplotlib的散点图、直方图、柱状图
2.3.1 对比常用统计图
折线图:以折现的上升或下降来表示统计数量的增减变化的统计图
特点: 能够显示数据的变化趋势,反映事物的变化情况。(变化)
直方图:由一系列不等的纵向条纹或线段表示数据分布的情况。
一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据,展示一组或者多组数据的分布情况(统计)
条形图:排列在工作表的列或行中的数据可以绘制到条形图中。
特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
2.3.2 matplotlib绘制散点图
plt.scatter(x,y)
from matplotlib import pyplot as plt
from matplotlib import font_manager
def test02():
"""
使用scatter方法绘制散点图
:return:
"""
my_font = font_manager.FontProperties(fname="C:\\Windows\\Fonts\\方正粗黑宋简体.ttf")
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(51,82)
# 设置图形大小
plt.figure(figsize=(20,8),dpi=80)
plt.scatter(x_3,y_3,label="3月份")
plt.scatter(x_10,y_10,label="10月份")
#调整x轴的刻度
_x = list(x_3)+list(x_10)
_xtick_labels = ["3月{}日".format(i) for i in x_3]
_xtick_labels += ["10月{}日".format(i-50) for i in x_10]
plt.xticks(_x[::3],_xtick_labels[::3],fontproperties=my_font,rotation=45)
# 添加图例
plt.legend(loc="upper left",prop=my_font)
# 添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度",fontproperties=my_font)
# 展示
plt.show()
return None
if __name__ == "__main__":
test02()
散点图的更多应用场景
- 不同条件(维度)之间的内在关联关系
- 观察数据的离散聚合程度
2.3.3 matplotlib绘制条形图
plt.bar(x,y)
from matplotlib import pyplot as plt
from matplotlib import font_manager
def test03():
"""
使用bar方法绘制条形图
:return:
"""
my_font = font_manager.FontProperties(fname="C:\\Windows\\Fonts\\方正粗黑宋简体.ttf")
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5","摔跤吧!爸爸","加勒比海盗5"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8]
# 设置图形大小
plt.figure(figsize=(20, 8), dpi=80)
# 绘制条形图
# plt.bar(range(len(a)),b)
#绘制横着的条形图
plt.barh(range(len(a)),b,height=0.3,color="orange")
# 设置字符串到x轴
plt.yticks(range(len(a)),a,fontproperties=my_font,rotation=45)
plt.grid(alpha=0.3)
# 展示
plt.show()
return None
if __name__ == "__main__":
test03()
条形图的更多应用场景
- 数量统计
- 频率统计(市场饱和度)
2.3.4 matplotlib绘制直方图
把数据分多少组进行统计???
组数要适当,太少会有较大的统计误差,大多规律不明显
一般来说,能够使用plt.hist方法的是那些没有统计过的数据。
plt.hist(a,num_bins)
# → 传入需要统计的数据,以及组数即可
#plt.hist(a,[min(a)+i*bin_width for i in range(num_bins)])
# → 可以传入一个列表,长度为组数,值为分组依据,当组距不均匀时使用
#plt.hist(a,num_bins,normed=1)
# normed:bool 是否绘制频率分布直方图,默认为频数直方图
from matplotlib import pyplot as plt
from matplotlib import font_manager
def test04():
"""
使用 hist方法绘制直方图
:return:
"""
my_font = font_manager.FontProperties(fname="C:\\Windows\\Fonts\\方正粗黑宋简体.ttf")
a = [131,98,125,131,124,139,131,117,128,108]
#计算数组
d = 5 # 组距
num_bins=(max(a)-min(a))//d + 1 # 组数
# 设置图形大小
plt.figure(figsize=(20,8),dpi=80)
# 绘制直方图,第二个参数为组数
plt.hist(a,num_bins)
# 设置x轴的刻度
plt.xticks(range(min(a),max(a)+d),d)
# 展示
plt.show()
return None
if __name__ == "__main__":
test04()
直方图更多应用场景
- 用户年龄分布状态
- 一段时间内用户点击次数的分布状态
- 用户活跃时间的分布状态
matplotlib常见问题总结
- 应该选择那种图形来呈现数据
- matplotlib.plot(x,y)
- matplotlib.bar(x,y)
- matplotlib.scatter(x,y)
- matplotlib.hist(data,bins,normed)
- xticks和yticks的设置
- label和title,grid的设置
- 绘图的大小和保存图片
2.4 更多的画图工具
matplotlib支持的图形是非常多的,如果有其他的需求,我们可以查看一下URL地址:http://matplotlib.org/gallery/index.html
前端框架:echarts、plotly