目录
十一.matplotlib可视化
1 数据可视化
2 应用场景
3 Matplotlib
脚本层
美工层
后端层
3.1 第一个绘图程序
matplotlib常用配置
查看自己电脑上的 字体库
3.2 基本绘图
plt.plot()
3.3 样式和颜色
3.4 画布配置figure
坐标轴及标签
设置图例???
添加注释 plt.annotate (点的坐标)
在一个画布上画多个图
作图完整演示代码
4 多图 布局
子图 subplot()
子图 subplots()
图像嵌套add_subplot()
图像嵌套add_axes()&axes()
5 常用视图
5.1 折线图
单条折线
多条折线
5.2 柱状图
5.3 饼图
十一.matplotlib可视化
1 数据可视化
如果将文本数据与图表数据相比较,人类的思维模式更适合于理解后者,原因在于图表数据更加直观且形象化,它对于人类视觉的冲击更强,这种使用图表来表示数据的方法被叫做 数据可视化。
图表为更好地探索、分析数据提供了一种直观的方法,它对最终分析结果的展示具有重要的作用。
对于组织决策者而言,数据可视化也只是一种辅助工具,从寻找数据间关联到最终做出决定,大致分为以下四步:
-
可视化(Visualize):使用不同种类的图表对原始数据进行可视化处理,使复杂的数据更容易理解与使用;
-
分析(Analysis):数据分析的目的是获取有用的信息,这个过程主要涉及对数据的清洗、检查、转换以及对数据的建模;
-
文档说明(Document insight):文档说明属于整理、汇总阶段,将有用的数据或者信息整理出来;
-
数据集转换(Transform Data Set):指将数据进行分类、分级、统计记录格式与编码格式等。
2 应用场景
数据可视化主要有以下应用场景:
-
企业领域:利用直观多样的图表展示数据,从而为企业决策提供支持;
-
股票走势预测:通过对股票涨跌数据的分析,给股民提供更合理化的建议;
-
商超产品销售:对客户群体和所购买产品进行数据分析,促使商超制定更好的销售策略;
-
预测销量:对产品销量的影响因素进行分析,可以预测出产品的销量走势。
其实不管是在日常生活,还是工作中,我们都会根据过往的经验作出某些决定,这种做法也叫做“经验之谈”。
数据分析和其类似,通过对过往数据的大量分析,从而对数据的未来走势做出预测。
3 Matplotlib
Matplotlib 是一款用于数据可视化的 Python 软件包,支持跨平台运行,它能够根据 NumPy ndarray 数组来绘制 2D 图像,它使用简单、代码清晰易懂,深受广大技术爱好者喜爱。
Matplotlib 由三个不同的层次结构组成,分别是脚本层、美工层和后端层。
-
脚本层
脚本层是 Matplotlib 结构中的最顶层。我们编写的绘图代码大部分代码都在该层运行,它的主要工作是负责生成图形与坐标系。
-
美工层
美工层是结构中的第二层,它提供了绘制图形的元素时的给各种功能,例如,绘制标题、轴标签、坐标刻度等。
-
后端层
后端层是 Matplotlib 最底层,它定义了三个基本类,
首先是 FigureCanvas(图层画布类),它提供了绘图所需的画布,
其次是 Renderer(绘图操作类),它提供了在画布上进行绘图的各种方法,
最后是 Event(事件处理类),它提供了用来处理鼠标和键盘事件的方法。
3.1 第一个绘图程序
import matplotlib.pyplot as plt import pandas as pd import numpy as np
matplotlib常用配置
# 浏览器不显示图片 %matplotlib inline # 图片中文显示 plt.rcParams["font.sans-serif"] = "SimHei" # 图片中显示负号 plt.rcParams["axes.unicode_minus"] = False # 支持svg矢量图 %config InlineBackend.figure_format = "svg"
注意:%matplotlib inline 是 Jupyter 提供的魔法命令,它可以把输出图显示在笔记本内部
查看自己电脑上的 字体库
from matplotlib.font_manager import FontManager fm = FontManager() my_font = set(f.name for f in fm.ttflist) print(my_font)
3.2 基本绘图
plt.plot()
# 生成-5到5,的等差数列,总共50份 x = np.linspace(-5,5,50) # 绘制抛物线 plt.plot(x**2)
3.3 样式和颜色
符号 | '-','--','-.',':','.',',',,o,^,v,<,>,s,+,x,D,d,1,2,3,4,h,H,p,| ,_ |
---|---|
颜色 | b(蓝色),g(绿色),r(红色),c(青色),m(品红),y(黄色),k(黑色),w(白色) |
# 生成-5到5,的等差数列,总共50份 x = np.linspace(-5,5,50) # color:颜色 ls:样式 # plt.plot(x**2,color="r",ls="--") plt.plot(x**2,"r--") plt.plot(x**2-2*x,'b|') ---------------------------- # 标题名称 plt.title("这是一张表") plt.title('这是标题',fontsize=60)
3.4 画布配置figure
参数 | 说明 |
---|---|
figsize | 指定画布的大小,(宽度,高度),单位为英寸。 |
dpi | 指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。 |
# 画布配置 plt.figure(figsize=(8,8),dpi=120,facecolor='yellow') # figsize:画布大小,宽和高 # dpi:分辨率 # facecolor:背景颜色 ----------------------- x = np.linspace(0, 10) y = np.sin(x) plt.plot(x,y)
坐标轴及标签
# 坐标轴及标签 plt.xlim(0,6) #x轴坐标轴 plt.ylim((0, 3))#y轴坐标轴 plt.xlabel('时间')#x轴标签 plt.ylabel('价格')#y轴标签 plt.title("这是一张表") plt.show()
设置图例???
plt.figure(figsize=(10,5)) x = np.linspace(0,10) plt.plot(x, np.sin(x),"r",label="正弦") plt.plot(x, np.cos(x),"b",label="余弦") plt.legend(loc="best") #图列位置,可选best,center
添加注释 plt.annotate (点的坐标)
x = np.arange(1,11) y = x*x #plt.plot(x,y,marker="o",linestyle="") plt.plot(x,y,marker="o") for xy in zip(x,y):print(xy) plt.annotate("(%s,%s)"%xy,xy=xy) plt.show()
在一个画布上画多个图
plt.figure(figsize=(20,10)) x = np.linspace(0,10) plt.plot(x, np.sin(x),"r+") plt.plot(x, np.cos(x),"b+") plt.plot(x, -np.sin(x),"k--") plt.plot(x, -np.cos(x),"g--") # 立刻显示图片 plt.show()
作图完整演示代码
#导入模块 import matplotlib.pyplot as plt import pandas as pd import numpy as np #基本配置 plt.rcParams["font.sans-serif"] = "SimHei" plt.rcParams["axes.unicode_minus"] = False #配置画布大小. plt.figure(figsize=(10,5)) #配置横纵坐标轴大小及名称&标题 y=np.sin(x) plt.xlim(0,15) plt.ylim(-1,3) plt.xlabel('x',fontsize=20) plt.ylabel('y',fontsize=20) plt.title("完整作图",fontsize=30) # x = np.linspace(0,10,11) y = np.sin(x) #显示点的坐标. plt.plot(x,x,marker='o',label='一次') plt.plot(y,'b',label='sin()') #z这里分的次数很少,所以显示时很像折线. #显示图例. plt.legend(loc='best',fontsize=20) #点: for x in zip(x,x):# print(x,x)plt.annotate('(%s%s)'%x,x) plt.show() # plt.plot(x,y,'y',label='e~~') # plt.plot(y,'g',label='sin()')
4 多图 布局
子图 subplot()
fig = plt.figure(figsize=(6,4)) x = np.linspace(1,10,20) y = np.sin(x) ax1 = plt.subplot(2,2,1)# 2行2列中的第一个图 ax1.plot(x,y) ax1.set_title("子图1") ax2 = plt.subplot(2,2,2)# 2行2列中的第二个图 ax2.plot(x,y) ax2.set_title("子图2") ax3 = plt.subplot(2,2,3)# 2行2列中的第三个图 ax3.plot(x,y) ax3.set_title("子图3") ax4 = plt.subplot(2,2,4)# 2行2列中的第四个图 ax4.plot(x,y) ax4.set_title("子图4") # 自动调整布局 fig.tight_layout()
子图 subplots()
x = np.linspace(1,10,10) fig, ax = plt.subplots(3,3) ax1,ax2,ax3 = ax ax11,ax12,ax13 = ax1 ax21,ax22,ax23 = ax2 ax31,ax32,ax33 = ax3 fig.set_figwidth(8) # 设置宽 fig.set_figheight(5) # 设置高 fig.tight_layout() ax11.plot(x,np.sin(x),color="r") ax12.plot(x,np.cos(x)) ax13.plot(x,np.tan(x)) ax21.plot(x,np.sin(x)+np.cos(x)) ax22.plot(x,np.cos(x)+np.cos(x)) ax23.plot(x,np.tan(x)+np.cos(x)) ax31.plot(x,-np.sin(x)) ax32.plot(x,-np.cos(x)) ax33.plot(x,-np.tan(x))
图像嵌套add_subplot()
fig = plt.figure(figsize=(8,5)) # 子图一 axes1 = fig.add_subplot(1,1,1) axes1.plot([0,1],[3,4],marker="o") # 子图二 axes2 = fig.add_subplot(2,2,1) axes2.plot([0,1],marker="o")
图像嵌套add_axes()&axes()
fig = plt.figure(figsize=(10,6)) x = np.linspace(0,10,30) y = np.sin(x) plt.plot(x,y) # 嵌套图一 axes1 = plt.axes([0.5,0.5,0.3,0.3]) axes1.plot(x,y,color="g") # 嵌套图二 axes2 = fig.add_axes([0.18,0.18,0.3,0.3]) axes2.plot(x,y,color="r")
5 常用视图
5.1 折线图
单条折线
x = ["Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"] y = np.random.randint(25,55,size=7) plt.plot(x, y, "g", marker='o', markersize=5, label="周活") # 绘制坐标轴标签 plt.xlabel("时间") plt.ylabel("用户活跃度") plt.title("活跃度") # 显示图例 plt.legend(loc="best") # 调用 text()在图像上绘制注释文本 # x1、y1表示文本所处坐标位置,ha参数控制水平对齐方式, va控制垂直对齐方式,str(y1)表示要绘制的文本 for x1, y1 in zip(x, y):plt.text(x1, y1, str(y1), ha='center', va='bottom', fontsize=10)
多条折线
# 对比两天内同一时刻温度的变化情况 x = [5, 8, 12, 14, 16, 18, 20] y1 = [18, 21, 29, 31, 26, 24, 20] y2 = [15, 18, 24, 30, 31, 25, 24] plt.plot(x, y1, 'r',marker='o', markersize=5) plt.plot(x, y2, 'b', marker='o',markersize=5) plt.title('温度对比折线图') # 折线图标题 plt.xlabel('时间(h)') # x轴标题 plt.ylabel('温度(℃)') # y轴标题 # 给图像添加注释,并设置样式 for a, b in zip(x, y1):plt.text(a, b, b, ha='center', va='bottom', fontsize=10) for a, b in zip(x, y2):plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
5.2 柱状图
-
柱状图
#准备数据 langs = ['C', 'C++', 'Java', 'Python', 'PHP'] students = [23,17,35,29,12] #绘制柱状图 plt.xlabel("语言") plt.ylabel("热度") plt.bar(langs,students) plt.show()
5.3 饼图
sizes = [2,5,12] labels = ['娱乐','育儿','饮食'] plt.pie(sizes,labels=labels,autopct='%1.1f%%',shadow=False,startangle=100) plt.show() # labels为饼图加标签 # autopct 控制饼图内百分比设置 # '%1.1f'指小数点前后位数 # shadow是在饼图下画一个阴影,False即不画