python可视化1——基于matplotlib库
下文主要内容来自课堂讲义,由本人整理。
1. 画图前准备
1.1 pip安装pandas、numpy、plt库;
1.2 中文显示问题:
win系统直接添加:
1 2
| plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False
|
但是在MAC系统下中文字体显示问题报错:
Font family [‘sans-serif‘] not found.Falling back to DejaVu Sans.
解决方法:
在python下输入代码获取自己mac内字体存放路径:matplotlib.matplotlib_fname()
下载黑体字体后拷贝到第1步中找到到路径中存放字体文件夹
大致路径如下
/Users/********/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf
需要在Finder根目录下,按shift+command+. (.是英文句号),开启隐藏目录后删除下图中Fontlist文件。重启python即可。
2. 引例——文件读取
数据,存为.csv文件:
1 2 3 4 5 6
| ,语文 ,数学 ,英语 ,计算机 ,物理 ,化学 ,体育 宋丽英 ,86,64,85,88,90,55,98 王大伟 ,92,99,95,94,92,94,90 顾亦菲 ,91,87,99,95,95,92,85 鲁一平 ,78,99,75,81,83,88,92 潘晓雯 ,88,78,98,84,70,95,98
|
分析每门课的成绩,制作箱型图。
1 2 3 4 5 6
| import matplotlib.pyplot as plt import pandas as pd scores=pd.read_csv("data1.csv",index_col=0) plt.rcParams['font.sans-serif']=['SimHei'] scores.boxplot() plt.show()
|
3. 【例1】 条形图的绘制步骤
第一步:导入必要的库
1 2
| import matplotlib.pyplot as plt import numpy as np
|
第二步:新建绘图区或子绘图区
1 2 3
| plt.figure(figsize=(4,3),facecolor='b') 或者: fig,ax=plt.subplots(figsize=(4,3))
|
第三步:准备数据
1 2
| kc=('语文', '数学', '英语') # 课程信息 cj= (70, 95, 80) # 成绩数据
|
第四步:设置图表属性
1 2 3 4 5
| ax.set_xlabel('课程') #设置X轴的标题 ax.set_ylabel('成绩') #设置Y轴的标题 ax.set_title('成绩示例') #设置图表标题 ax.set_xticks(np.arange(3)) #设置分类轴的刻度[0,1,2] ax.set_xticklabels(kc) #设置分类轴的显示标签
|
第五步:绘制图表
1 2
| rt = plt.bar(np.arange(3) , cj , label='刘芸') #参数1指定分类轴的刻度,参数2指定作图用的数据,参数3指定图例的标签文本
|
第六步:显示图例
1
| ax.legend(bbox_to_anchor=(1,0.8)) #显示图例文字
|
第七步:显示图表
3.1 绘图区
Matplotlib的图表区主要包括绘图区、图像和辅助显示对象
1 绘图区:包含Canvas、Figure和Axes三个对象,既可以由系统自动创建,也可以根据需要调用Figure()函数创建;
2 图像:调用各个绘图函数绘制的柱状图、折线图、饼图和散点图等;
3 辅助显示对象:包括标题、坐标轴、坐标轴名称、坐标轴刻度、坐标轴刻度 标签、图表边框线、网格线、图例、前景色等内容;
(1)自动创建绘图区:直接调用绘图函数,系统自动创建一个默认大小的绘图区
(2)手动创建绘图区:如下
1 2 3
| import matplotlib.pyplot as plt plt.figure(figsize=(6,4),dpi=72) plt.plot((3,6))
|
(1)figure( )函数 用于生成一个全局绘图区
figure([num=None, figsize=None, dpi=None, facecolor=None……, **kwargs])
注意:当前绘图区上没有建立坐标轴,默认不显示该全局绘图区。
如:
plt.figure()
plt.figure(figsize=(6,6),facecolor=‘g’)
(2)axes( )函数 生成坐标系风格的绘图区并显示
plt.axes(arg=None, **kwargs)
plt.axes(rect, projection=None, polar=False, **kwargs)如:plt.axes((0.1,0.3,0.5,0.8),facecolor=’y’)
注意:参数1对应(left,bottom,width,height),坐标原点默认为左下角的(0,0)
(1)subplot( )函数 在全局绘图区创建子绘图区并显示
subplot(nrows, ncols, index, **kwargs)
注意:如果nrows、ncols和index都小于10缩写为一个整数
subplot(323)等价于subplot(3,2,3)
plt.subplot(1,1,1) #表示有1行1列,绘制在第1个子绘图区
plt.subplot(232) #有2行3列共6个子绘图区,只显示第2个
(2)add_subplot(nrows, ncols, index[, **kwargs])
用于给已有全局绘图区添加子绘图区
1 2 3 4 5 6 7 8 9 10
| import matplotlib.pyplot as plt import numpy as np fig1=plt.figure( ) fig1.add_subplot(222) plt.plot((5,3,5),c='b',marker='D') fig1.add_subplot(223) x=np.random.randint(0,100,50) y=np.random.normal(0,100,50) plt.scatter(x,y,c='r') plt.show()
|
(3)subplots(nrows, ncols, **fig_kw)函数
创建全局绘图区,然后添加多个子绘图区并显示所有子绘图区
1 2 3 4 5 6 7
| import matplotlib.pyplot as plt import numpy as np fig,ax = plt.subplots(nrows=2,ncols=3,figsize=(6,4),dpi=72) plt.subplots_adjust(wspace=0.3,hspace=0.3) ax[0][1].plot((5),'y^') ax[1][2].plot((3,8),'g') plt.show()
|
注意:
[1]当行数与列数值均大于1时,用ax[i][j]访问;
[2]当行数或列数只有一个值等于1时,用ax[i]访问;
[3]当行数与列数值均等于1时,用plt或ax访问;
3.2 常见图表函数
函数 |
描述 |
plt.plot(x,y,color,linewidth,linestyle,label) |
根据x,y数组绘制直线或曲线 |
plt.boxplot(data,label) |
绘制一个箱型图 |
plt.bar(x, height, width, bottom, *, align=’center’, **kwargs) |
绘制一个条形图(即柱状图) |
plt.barh(y, width, height, left, *, align=’center’, **kwargs) |
绘制一个横向条形图 |
plt.polar(theta,r) |
绘制极坐标图 |
plt.pie(data,explode) |
绘制饼图 |
plt.scatter(x,y) |
绘制散点图 |
plt.hist(x,bins,normed) |
绘制直方图 |
plt.contour(X,Y,Z,N) |
绘制等高线 |
3.3 坐标轴设置函数
函数 |
描述 |
plt.axis( ) 输出:(0.0, 1.0, 0.0, 1.0) |
显示当前坐标轴刻度的取值范围 |
plt.axes( ) 输出:<matplotlib.axes._subplots.AxesSubplot at 0x22f751cb3c8> |
显示子绘图区 |
plt.xlim(xmin=1,xmax=5) |
设置X轴刻度取值范围为[1,5] |
plt.ylim(ymin=3,ymax=6) |
设置Y轴刻度取值范围为[3,6] |
plt.xscale(scale ) scale : [‘linear’ | ‘log’ | ‘logit’ | ‘symlog’] |
设置X轴缩放 |
plt.yscale(scale) |
设置Y轴缩放 |
plt.autoscale( ) |
自动缩放轴视图的数据 |
plt.text(x,y,s,fontdic,withdash) 如:plt.text(0.5,0.5,’Max’) |
在指定位置添加注释文本 在两个坐标轴的中间位置输出“Max” |
plt.grid(True/Flase) |
是否显示绘图网格 |
3.4 标签设置函数
函数 |
描述 |
plt.title(“TITLE”,loc=’right’) |
设置图表的标题loc:{‘center’,’left’,’right’} |
plt.xlabel(“水平轴标题”) |
设置X轴的标题 |
plt.ylabel(“垂直轴标题”) |
设置Y轴的标题 |
plt.legend(loc=‘upper right’ )或直接指定相对位置:ax.legend(bbox_to_anchor=(1,0.8)) |
在指定位置显示图例一般在绘图函数中用label参数指定图例的文本内容 |
plt.xticks( ) 如:plt.xticks(np.arange(3), (‘Tom’, ‘Dick’, ‘Harry’)) |
设置X轴的刻度范围及显示标签 |
plt.yticks( ) 如:plt.yticks(np.arange(3), (‘1’,’2’,’3’)) |
设置Y轴的刻度范围及显示标签 |
3.5 绘制线条
plot( ): 用于绘制线条和标记,不仅可以绘制折线图、曲线图,还可以制作 出类似散点图的效果。 plot函数的使用形式为:
plt.plot([x],y, [fmt],**kwargs)
(1)x和y通常是列表或元组等序列,x中存储所有顶点的x坐标序列,y中存储所有顶点的y坐标序列, 其中参数x可以缺省,缺省值为列表[0, 1, 2, …, n-1]。
(2)参数fmt是一个字符串变量,用于定义图表的基本属性,如颜色(color)、标记(marker)、 线型(linestyle)等。
如:plt.plot([2,3],[5,7], ‘bD:’, linewidth=5)
(3)kwargs是一个关键字参数,用于接收0个或多个由属性与属性值组成的键值对。若颜色属性赋值 为”green”、”black”等单词形式,则不能用fmt参数来组合赋值,必须对单个颜色属性赋值。
如:plt.plot([2,3],[5,7], color=’blue’, marker=’D’, linestyle =’:’,linewidth=5)
plt.plot((5),‘ro’) #在坐标(0,5)处绘制一个红色的圆点
plt.plot((5,10),‘g’) #从(0,5)到(1,10)绘制一条绿色的直线
plt.plot((5,10,3),‘B’) #从(0,5)到(1,10)再到(2,3)绘制一条蓝色的折线
注意:省略x坐标的话,x坐标默认为列表[0,1,2,…,N-1]
小栗子🌰:
1 2 3 4 5
| import matplotlib.pyplot as plt plt.plot((1,3,5),(2,6,4),'y^') plt.plot((3,6),(1,5), color='g', marker='D',linestyle=':',linewidth=2, markersize=12)
plt.show()
|
1 2 3 4
| import matplotlib.pyplot as plt plt.plot((2,1), (3,5), 'g^', (5,1), (6,8), 'r:')
plt.show()
|
1 2 3 4
| import matplotlib.pyplot as plt plt.plot([5,2,1], [3,1,3], 'yD-', label='line 1', lw=4) plt.legend(loc='center right') plt.show()
|
线条的类型
linestyle (ls) |
描述 |
‘-‘ |
减号 画实线 |
‘:’ |
冒号 画短虚线 |
‘None’ |
不画线 |
‘–’ |
2个减号 画长虚线 |
‘-. ‘ |
减号加点 画点划线 |
线条的标记
marker |
描述 |
marker |
描述 |
‘o’ |
圆圈 |
‘.’ |
点 |
‘D’ |
菱形 |
‘s’ |
正方形 |
‘h’ |
六边形1 |
‘*’ |
星号 |
‘H’ |
六边形2 |
‘d’ |
小菱形 |
‘_’ (下划线) |
水平线 |
‘v’ |
下的角形 |
‘8’ |
八边形 |
‘<’ |
左的角形 |
‘p’ |
五边形 |
‘>’ |
右三角形 |
‘,’ |
像素 |
‘^’ |
上三角形 |
‘+’ |
加号 |
‘|’ |
竖线 |
‘None’ |
无 |
‘x’ |
X |
指定颜色控制
缩写 |
颜色 |
r’ |
red |
‘g’ |
green |
b’ |
blue |
‘c’ |
cyan |
‘m’ |
magenta |
‘y’ |
yellow |
‘w’ |
white |
‘k’ |
black |
4. 绘制常用激活函数的曲线图
分析:激活函数是一种非线性的数学变换,用于对上一层神经元的输出结果进行某种数学变换,将转换后的结果作为下一层神经元的输入,这样的非线性变换有助于实现神经网络模型的非线性分类。
常见的三种激活函数如下:
1 Sigmoid激活函数
2 tanh激活函数(双曲正切函数)
3 ReLU激活函数(Rectified Linear Unit, 线性整流函数)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import numpy as np import matplotlib.pyplot as plt
fig,ax=plt.subplots(nrows=1,ncols=3,figsize=(12,4)) plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False x=np.linspace(-10,10,100)
sigm=1/(1+np.exp(-x)) tanh = np.tanh(x) relu= (np.abs(x) + x) / 2
ax[0].set_title("sigmoid激活函数") ax[0].plot(x,sigm,color='r',lw=3, ls='-',label='sigmoid函数') ax[0].legend(loc='upper left') ax[1].set_title("tanh激活函数") ax[1].plot(x,tanh,color='g',lw=3, ls='-',label='tanh函数') ax[1].legend(loc='upper left') ax[2].set_title("ReLu激活函数") ax[2].plot(x,relu,color='b',lw=3, ls='-',label='ReLu函数') ax[2].legend(loc='upper left')
plt.show( )
|
5. 绘制五角星并填充为红色
1 坐标原点o(0,0)为坐标原点
2 五角星的长轴为R = |oa|,长度已知
3 五角星的短轴为r = |oa1|
4 角度转化为弧度:rad = π/180 rad
目标效果图:
计算思路(似乎有点不大对,可能需要自己算):
计算方式和代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| import matplotlib.pyplot as plt import numpy as np
plt.rcParams["font.sans-serif"] = ["SimHei"] fig = plt.figure(figsize=(6, 6), dpi=72) plt.rcParams["axes.unicode_minus"] = False
R = 10 r = R * np.sin(np.pi / 10) / np.cos(np.pi / 5)
xa = [] ya = [] for k in range(0, 11, 1): xx = ((1 + (-1) ** k) / 2 * R + (1 + (-1) ** (k + 1)) / 2 * r) * np.cos( np.pi / 2 + np.pi / 5 + (k + 1) // 2 * np.pi * 2 / 5 + np.pi / 5 * (1 + (-1) ** k) / 2 ) yy = ((1 + (-1) ** k) / 2 * R + (1 + (-1) ** (k + 1)) / 2 * r) * np.sin( np.pi / 2 + np.pi / 5 + (k + 1) // 2 * np.pi * 2 / 5 + np.pi / 5 * (1 + (-1) ** k) / 2 ) xa.append(xx) ya.append(yy) plt.fill(xa, ya, "r")
theta = np.arange(0, 2 * np.pi, 0.01) x = r * np.sin(theta) y = r * np.cos(theta) plt.plot(x, y, "g")
k = np.arange(0, 6, 1) x = r * np.cos(np.pi / 2 + np.pi / 5 + k * np.pi * 2 / 5) y = r * np.sin(np.pi / 2 + np.pi / 5 + k * np.pi * 2 / 5) plt.scatter(x, y, color="b", s=100) plt.plot(x, y, "w")
theta = np.arange(0, 2 * np.pi, 0.01) x = R * np.sin(theta) y = R * np.cos(theta) plt.plot(x, y, "b")
k = np.arange(0, 6, 1) x = R * np.cos(np.pi / 2 + np.pi / 5 + k * np.pi * 2 / 5 + np.pi / 5) y = R * np.sin(np.pi / 2 + np.pi / 5 + k * np.pi * 2 / 5 + np.pi / 5) plt.plot(x, y, color="orange") plt.scatter(x, y, color="r", s=90)
plt.xticks(np.linspace(-10, 10, 5)) plt.yticks(np.linspace(-10, 10, 5)) plt.title("红五角星") plt.show()
|
6. 填充
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import matplotlib.pyplot as plt import numpy as np a=1 b=0.1 dt=0 theta=b*np.linspace(0,2*np.pi,10) x1=a*np.cos(theta+dt)*np.exp(theta) y1=a*np.sin(theta+dt)*np.exp(theta) dt +=0.1 x2=a*np.cos(theta+dt)*np.exp(theta) y2=a*np.sin(theta+dt)*np.exp(theta) x3=np.concatenate((x1,x2[::-1]))
y3=np.concatenate((y1,y2[::-1]))
plt.scatter(x3,y3,color="r") plt.fill(x3,y3) plt.show()
|
循环起来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import matplotlib.pyplot as plt import numpy as np a=1 b=0.3
theta=b*np.arange(0,2*np.pi,0.5) for dt in np.arange(0,2*np.pi,np.pi/8): x1=a*np.cos(theta+dt)*np.exp(theta) y1=a*np.sin(theta+dt)*np.exp(theta) dt=dt+np.pi/20 x2=a*np.cos(theta+dt)*np.exp(theta) y2=a*np.sin(theta+dt)*np.exp(theta) x3=np.concatenate((x1,x2[::-1])) y3=np.concatenate((y1,y2[::-1])) plt.fill(x3,y3) plt.show()
|
7.绘制柱状图
plt.bar(x,height,width=0.8,bottom=None,……,**kwargs,)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif']=['SimHei'] fig= plt.figure(figsize=(10,4)) seasons=['一季度', '二季度', '三季度','四季度'] saleA= [300,360,210,260] saleB= [380,350, 400,290] index=np.arange(4) barW=0.3
fig.add_subplot(121) plt.bar(index,saleA,barW,color='m',label='产品A') plt.bar(index+barW,saleB,barW,color='b',label='产品B') plt.title("并列柱状图") plt.ylabel("销售额(万元)",rotation=90) plt.xticks(index,seasons) plt.legend(loc='upper right')
fig.add_subplot(122) plt.bar(index,saleA,barW,color='g',label='产品A') plt.bar(index,saleB,barW,bottom=saleA,color='y',label ='产品B') plt.title("堆叠柱状图") plt.xlabel("时间",loc="right") plt.xticks(index,seasons) plt.legend(loc='upper right') plt.show( )
|
8.绘制饼图
plt.pie(x,explode=None)
1 2 3 4 5 6 7 8 9 10 11
| import matplotlib.pyplot as plt score = [800,500,300,200,100] plt.rcParams['font.sans-serif']=['SimHei'] plt.title("消费分析") labels = ['伙食费', '生活用品', '学习用品', '娱乐','其他'] explode = (0.1, 0, 0, 0, 0) plt.axis("equal") plt.pie(score, explode=explode, autopct='%4.1f%%', labels=labels)
plt.legend(bbox_to_anchor=(1, 1)) plt.show( )
|
9.绘制散点图
plt.scatter(x, y, s=None, c=None, marker=None, cmap=None,**kwargs)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from sklearn.datasets import load_iris import matplotlib.pyplot as plt from matplotlib import cm plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False iris=load_iris() dt=iris.data tg=iris.target plt.scatter(dt[:,0],dt[:,3],c=tg,marker="*",cmap='viridis')
plt.show()
|
改用plot绘制标记
1 2 3 4 5 6 7 8 9 10 11 12 13
| from sklearn.datasets import load_iris import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False iris=load_iris() dt=iris.data tg=iris.target
plt.plot(dt[tg==0,2],dt[tg==0,3],'b^',label='山鸢尾花') plt.plot(dt[tg==1,2],dt[tg==1,3],'r*',label="变色鸢尾花") plt.plot(dt[tg==2,2],dt[tg==2,3],'go',label="维吉尼亚鸢尾花") plt.legend() plt.show()
|
10.分别用plot 和scatter绘制图案
1 2 3 4 5 6 7 8
| import numpy as np import matplotlib.pyplot as plt fig=plt.figure(figsize=(6,6)) a=np.arange(0,2*np.pi,0.02) r=np.sin(4*a) x,y=r*np.cos(a),r*np.sin(a) plt.plot(x,y, "b",linewidth=4) plt.show()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import numpy as np import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"]=["SimHei"] X=[];Y=[]
for a in np.arange(0,2*np.pi,0.02): r=np.sin(4*a) x=r*np.cos(a) y=r*np.sin(a) X.append(x) Y.append(y) plt.scatter(X,Y,s=5,c="g",marker=".") plt.title("散点绘制艺术图案") plt.show()
|
11.用直方图分别显示泰坦尼克号上乘客的性别和年龄分布情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import matplotlib.pyplot as plt import pandas as pd dt=pd.read_csv("/Users/hahaguowang/Library/Mobile Documents/com~apple~CloudDocs/大四上/课程/数据科学/new_code/20211020/titanic.csv") fig, ax = plt.subplots(nrows=1,ncols=2,figsize=(10,3)) plt.rcParams['font.sans-serif']=['SimHei'] xb=list(dt['Sex']) x1=[0.25,0.75]; xbNum=[] xbNum.append(xb.count("male")) xbNum.append(xb.count("female")) ax[0].hist(xb, bins=2, rwidth=0.5) ax[0].set_title("泰坦尼克号上乘客的性别分布") ax[0].set_xlabel('性别'); ax[0].set_ylabel('人数') ax[0].set_xticks(x1); ax[0].set_xticklabels(['男性','女性']) for a,b in zip(x1,xbNum): ax[0].text(a, b-50, '%.0f' % b, ha='center') age=list(dt['Age']) ax[1].hist(age, bins=15) ax[1].set_title("泰坦尼克号上乘客的年龄分布") ax[1].set_xlabel('年龄'); ax[1].set_ylabel('人数') plt.show()
|
三维可视化
- 首先调用figure()函数创建一个绘图区
- 然后调用Axes3D()函数创建三维坐标系
或者通过gca( )函数获取当前坐标系,并通过参数projection=‘3d’指定 绘制的是三维图表 #GCA表示:Get Current Axes
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure() #创建全局绘图区
ax = Axes3D(fig) #创建三维坐标系 plt.show()
1 2 3 4 5 6 7 8 9 10 11 12
| from mpl_toolkits.mplot3d import Axes3D import numpy as np import matplotlib.pyplot as plt fig=plt.figure() ax=Axes3D(fig) z=np.arange(-5*np.pi,5*np.pi,0.1) x,y=np.sin(z),np.cos(z) ax.set_xticks(np.linspace(-1,1,4)) ax.set_yticks(np.linspace(-1,1,3)) ax.set_zticks(np.linspace(-20,20,5)) plt.plot(x,y,z,c='r') plt.show()
|
鸢尾花的分类(三维可视化)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from sklearn import datasets import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D iris=datasets.load_iris( ) data=iris.data target=iris.target fig = plt.figure( ) ax = fig.add_subplot(111,projection='3d') ax.scatter(data[target==0,0],data[target==0,1],data[target==0,3],c='r',marker='o') ax.scatter(data[target==1,0],data[target==1,1],data[target==1,3],c='g',marker='^') ax.scatter(data[target==2,0],data[target==2,1],data[target==2,3],c='b',marker='*') ax.set_xlim(min(data[:,0]), max(data[:,0])) ax.set_ylim(min(data[:,1]), max(data[:,1])) ax.set_zlim(min(data[:,3]), max(data[:,3])) plt.show()
|
Author:
hhgw
License:
Copyright (c) 2023 CC-BY-NC-4.0 LICENSE
Slogan:
There is no fate but what we make.