绘制简单的图形
我们使用Mat子模块pyplot来绘制2D图形
范例1 绘制第一个图形
import math
import matplotlib.pyplot as plt
# 生成正弦曲线x点
nbSamples = 256
xRange = (-math.pi, math.pi) # X轴的取值区间【-Π,+Π】
x,y = [],[] # 创建两个空列表
for n in range(nbSamples):
ratio = (n+0.5)/nbSamples
x.append(xRange[0] + (xRange[1]-xRange[0])*ratio)
y.append(math.sin(x[-1])) # 将列表x中最后一个数据作为sin()函数的值,求出y
# 绘制正弦曲线
plt.plot(x,y) # x为数据点横坐标,y为数据点纵坐标,x和y可以是列表也可以是元组,但两者的长度要保持一致
plt.show()
范例2 使用Numpy简化数据构造
import math
import matplotlib.pyplot as plt
import numpy as np
# 生成正弦曲线的数据
nbSamples = 256
x = np.linspace(-math.pi,math.pi,num=256)
y = np.sin(x)
# 绘制图形
plt.plot(x,y)
plt.show()
范例3 修改图形中线条的属性
import numpy as np
import matplotlib.pyplot as plt
nbSamples = 128
x = np.linspace(-np.pi,np.pi,nbSamples)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x,y1,color='g',linewidth=4.,linestyle='--')# color颜色/linewidth宽度/linestyle形状
plt.plot(x,y2,'*',markersize=8,markerfacecolor='r',markeredgecolor='k')# '*'自动对应linestyle形状/markersize标记点大小/markerfacecolor填充色/markeredgecolor边线颜色
plt.show()
pyplot的高级功能
添加图例与注释
范例4 给图形添加图例
import numpy as np
import matplotlib.pyplot as plt
nbSamples = 128
x = np.linspace(-np.pi,np.pi,nbSamples)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x,y1,color='g',linewidth=4.,linestyle='--',label=r'$y=sin(x)$')# color颜色/linewidth宽度/linestyle形状
plt.plot(x,y2,'*',markersize=8,markerfacecolor='r',markeredgecolor='k',label=r'$y=cos(x)$')# '*'自动对应linestyle形状/markersize标记点大小/markerfacecolor填充色/markeredgecolor边线颜色
plt.legend(loc='best') # 设置使图例能够在画布最佳位置显示
plt.show()
范例5 显示坐标点
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0,10,1)
y = 2*x
for a, b in zip(x,y):
plt.text(a,b,(a,b),ha='center',va = 'bottom',fontsize = 10)# 前两个参数表示
# 要标注的x轴和y轴的坐标位置。第三个参数表示标注的文本内容。这里是显示坐标点
# ha为水平对齐,其可选参数为'center','right','left'
# va为垂直对齐,其可选参数为'center','top','bottom','center_baseline'
plt.plot(x,y,'bo-')
plt.show()
设置图形标题及坐标轴
范例6 设置图形标题及坐标轴
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-5,5,0.05)
y1 = np.sin(x)
y2 = np.cos(x)
# 为在mat中显示中文,设置特殊字体
plt.rcParams['font.sans-serif']=['SimHei'] # SimHei表示简体黑体
plt.rcParams['axes.unicode_minus']=False # 为了正确显示负号
plt.title('双曲线') # 给图形设置标题
plt.ylim(-1.2,1.2) # 设置y轴区间范围
plt.xlim(-6,6) # 设置x轴区间范围
plt.xticks(ticks=np.arange(-1.5*np.pi, 2*np.pi, 0.5*np.pi),
labels=['$-\\frac{3}{2}\pi$', '$-\pi$', '$-\\frac{1}{2}\pi$',
'0','$\\frac{1}{2}\pi$','$\pi$','$\\frac{3}{2}\pi$'])# 设置x轴刻度,
# ticks用于设置坐标轴的刻度值,labels用于设置坐标轴的标签值
plt.yticks(ticks=[-1,0,1]) # 设置y轴刻度
plt.xlabel('我是$X$轴') # 设置x轴名称
plt.ylabel('我是$Y$轴') # 设置y轴名称
plt.plot(x,y1,'r-',label='$y_1=sin(x)$')
plt.plot(x,y2,'b:',label='$y_2=cos(x)$')
plt.legend(loc='best')
plt.show()
范例6 一次性绘制多条曲线
import matplotlib.pyplot as plt
import numpy as np
# 在[0,4)区间,以间隔0.2均匀分割
data = np.arange(0,4,0.2)
# 分别使用红色的点画线、蓝色的方块和绿色的三角形来区分这三条曲线
plt.plot(data,data,'r-.',data,data**2,'bs',data,data**3,'g^')
plt.savefig('mult_lines.png', dpi=600) # 将显示的结果另存为一张图片
添加网格线
范例8 添加网格线
import matplotlib.pyplot as plt
import numpy as np
# 在[0,4)区间,以间隔0.2均匀分割
data = np.arange(0,4,0.2)
# 分别使用红色的点画线、蓝色的方块和绿色的三角形来区分这三条曲线
plt.plot(data,data,'r-.',data,data**2,'bs',data,data**3,'g^')
plt.grid(b=True) # 添加网格线
plt.savefig('mult_lines.png', dpi=600) # 将显示的结果另存为一张图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zR7EvR9G-1674903203099)(attachment:image.png)]
b是否添加网格;which(‘major’|‘minor’|‘both’),大网格|小网格|大网格里套小网格
axis:x轴添加、y轴添加、都添加
绘制多个子图
subplot(nrows,ncols,plot_number) nrows行ncols列第plot_number个子图
范例9 绘制两个子图
import matplotlib.pyplot as plt
import numpy as np
def f(t):
return np.exp(-t)*np.cos(2*np.pi*t)
t1 = np.arange(0.0,5.0,0.1)
t2 = np.arange(0.0,5.0,0.02)
# 第一种绘制子图的方法
fig = plt.figure() # 创建一个画布
sub_fig1 = fig.add_subplot(2,1,1) # 在画布上创建一个子图
sub_fig1.grid(True) # 添加网格线
plt.plot(t1,f(t1),'bo',t2,f(t2),'k') # 两个图叠加在一起成为点画图
# 第二种绘制子图的方法
plt.subplot(2,1,2)
plt.plot(t2,np.cos(2*np.pi*t2),'r--')
plt.show()
Axes与Subplot的区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZqnSVSTu-1674903203100)(attachment:image.png)]
import matplotlib.pyplot as plt
# 生成一个没有子图(Axes)的画布fig
fig = plt.figure()
plt.show()
<Figure size 432x288 with 0 Axes>
# 生成一个画布fig,fig中有2x2分布均匀的子图
fig, axes_lst = plt.subplots(2,2) # plt.subplots()返回两个值,一个是画布Figure,一个是Axes对象
plt.show()
# 构造x轴和y轴数据
x = np.linspace(0,2*np.pi,400)
y = np.sin(x**2)
# 在第一行第一列是子图中绘图
axes_lst[1,1].plot(x,y)
plt.show()
散点图
范例10 绘制散点图
import matplotlib.pyplot as plt
import numpy as np
# 产生50对服从正态分布的样本点
nbPointers = 50
x = np.random.standard_normal(nbPointers)
y = np.random.standard_normal(nbPointers)
# 固定种子,以便实验结果具有可重复性
np.random.seed(19680801)
colors = np.random.rand(nbPointers)
area = (30*np.random.rand(nbPointers))**2
plt.scatter(x,y,s = area, c = colors, alpha = 0.5) # 绘制点状图,参数s表示点的大小
# 参数c表示点的颜色,alpha表示透明度,其大小不超过1,数值越大越不透明
plt.show()
条形图与直方图
垂直条形图
范例12 绘制垂直条形图
import numpy as np
import matplotlib.pyplot as plt
objects = ('Python', 'C++', 'Java', 'Perl', 'Scala', 'Lisp')
y_pos = np.arange(len(objects))# 以横坐标对象数为长度产生一个顺序序列,以此确定x轴上各对象的位置
performance = [10,8,6,4,2,1]
plt.bar(y_pos,performance,align='center',alpha=0.5)
#plt.xticks(y_pos,objects)
plt.ylabel('用户量')
plt.title('数据分析程序语言使用分布情况')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
objects = ('Python', 'C++', 'Java', 'Perl', 'Scala', 'Lisp')
y_pos = np.arange(len(objects))# 以横坐标对象数为长度产生一个顺序序列,以此确定x轴上各对象的位置
performance = [10,8,6,4,2,1]
plt.bar(y_pos,performance,align='center',alpha=0.5)
plt.xticks(y_pos,objects)# 作用是确定x轴上各对象的名称
plt.ylabel('用户量')
plt.title('数据分析程序语言使用分布情况')
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G08Tm2rf-1674903203101)(attachment:image.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKB1Kigh-1674903203101)(attachment:image.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pdPgraZV-1674903203102)(attachment:image.png)]
水平条形图
范例13 绘制水平条形图
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] # SimHei表示简体黑体
plt.rcParams['axes.unicode_minus']=False # 为了正确显示负号
objects = ('Python', 'C++', 'Java', 'Perl', 'Scala', 'Lisp')
y_pos = np.arange(len(objects))# 以横坐标对象数为长度产生一个顺序序列,以此确定x轴上各对象的位置
performance = [10,8,6,4,2,1]
plt.barh(y_pos,performance,align='center',alpha=0.5,color = 'k',tick_label = objects)
# plt.xticks(y_pos,objects)# 作用是确定x轴上各对象的名称
plt.xlabel('用户量')
plt.title('数据分析程序语言使用分布情况')
plt.show()
并列条形图
范例14 绘制并列条形图
import numpy as np
import matplotlib.pyplot as plt
# 用于绘制图形条的数据
n_groups = 4
means_frank = (90,55,40,65)
means_guido = (85,62,54,20)
# 创建图形
fig,ax = plt.subplots()
# 定义条形图在横坐标上的分类位置
index = np.arange(n_groups)
bar_width = 0.35
opacity = 0.8
# 绘制第一个条形图
rects1 = plt.bar(index, # 定义第一个条形图的x轴坐标信息
means_frank, # 定义第一个条形图的y轴坐标信息
bar_width, # 定义图形的宽度
alpha=opacity, # 定义图形的透明度
color='b', # 定义图形颜色为蓝色
label='张三') # 定义图形的标签信息,注意是图形标签
# 绘制第二个条形图
rects2 = plt.bar(index+bar_width, # 与第一个条形图在x轴上无缝肩并肩
means_guido,
bar_width,
alpha=opacity,
color='g',
label='李四')
plt.xlabel('课程') # 注意是坐标轴的标签
plt.ylabel('分数')
plt.title('分数对比图')
plt.xticks(index+bar_width,('A','B','C','D'))
plt.legend()
plt.show()
范例15 绘制带有纹理填充的条形图
import numpy as np
import matplotlib.pyplot as plt
# 用于绘制图形条的数据
n_groups = 4
means_frank = (90,55,40,65)
means_guido = (85,62,54,20)
# 创建图形
fig,ax = plt.subplots()
# 定义条形图在横坐标上的分类位置
index = np.arange(n_groups)
bar_width = 0.35
opacity = 0.8
# 绘制第一个条形图
rects1 = plt.bar(index, # 定义第一个条形图的x轴坐标信息
means_frank, # 定义第一个条形图的y轴坐标信息
bar_width, # 定义图形的宽度
alpha=opacity, # 定义图形的透明度
color='w',edgecolor='k', # 填充颜色为白色,边界颜色为黑色
hatch='...', # 设置纹理类型
label='张三') # 定义图形的标签信息,注意是图形标签
# 绘制第二个条形图
rects2 = plt.bar(index+bar_width, # 与第一个条形图在x轴上无缝肩并肩
means_guido,
bar_width,
alpha=opacity,
color='w',edgecolor='k',
hatch='\\\\',
label='李四')
plt.xlabel('课程') # 注意是坐标轴的标签
plt.ylabel('分数')
plt.title('分数对比图')
plt.xticks(index+bar_width,('A','B','C','D'))
plt.legend()
plt.show()
叠加条形图
范例16 绘制叠加条形图
import numpy as np
import matplotlib.pyplot as plt
# 用于绘制图形条的数据
n_groups = 4
means_frank = (90,55,40,65)
means_guido = (85,62,54,20)
# 创建图形
fig,ax = plt.subplots()
# 定义条形图在横坐标上的分类位置
index = np.arange(n_groups)
bar_width = 0.35
opacity = 0.8
# 绘制第一个条形图
rects1 = plt.bar(index, # 定义第一个条形图的x轴坐标信息
means_frank, # 定义第一个条形图的y轴坐标信息
bar_width, # 定义图形的宽度
alpha=opacity, # 定义图形的透明度
color='w',edgecolor='k', # 填充颜色为白色,边界颜色为黑色
hatch='...', # 设置纹理类型
label='张三') # 定义图形的标签信息,注意是图形标签
# 绘制第二个条形图
rects2 = plt.bar(index,
means_guido,
bar_width,
bottom=means_frank, # 第二个条形图以第一个为底,以此类推,如果还有第三个条形图需要叠加,它的起点是第二个条形图的顶点
alpha=opacity,
color='w',edgecolor='k',
hatch='\\\\',
label='李四')
plt.xlabel('课程') # 注意是坐标轴的标签
plt.ylabel('分数')
plt.title('分数对比图')
plt.xticks(index+bar_width,('A','B','C','D'))
plt.legend()
plt.show()
直方图
范例17 绘制频率分布直方图
import numpy as np
import matplotlib.pyplot as plt
mu = 100
sigma = 15
x = mu+sigma*np.random.randn(200) # 随机生成期望为100,标准差为15的200个数据
num_bins = 25 # 划分的组数
plt.figure(figsize=(9,6),dpi=100)
n,bins,patches = plt.hist(x, # 指定要在x轴上绘制直方图所需要的数据
num_bins, # 指定直方图条形的个数,默认值为10
color='w', edgecolor='k',
hatch=r'ooo',
density=1, # 设置归一化处理,直方图下的面积总和为1
label='频率')
y = ((1/(np.sqrt(2*np.pi)*sigma))*
np.exp(-0.5*(1/sigma*(bins-mu))**2))
plt.plot(bins,y,'--',label='概率密度函数')
plt.rcParams['font.sans-serif']=['SimHei']
plt.xlabel('聪明度')
plt.ylabel('概率密度')
plt.title('IQ直方图:$\mu=100$,$\sigma=15$')
plt.legend
plt.show()
饼图
范例19 绘制饼图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
# 设置图片大小和分辨率
plt.figure(figsize=(9,6),dpi=100)
x = [217,743,426]
labels = ['走路去','自行车','公交车']
explode = [0,0.05,0]
_, _, autotexts = plt.pie(x=x, # 传入的数据。该数据类似于数组,其中每个元素代表每个饼块的比例
labels=labels, # 定义标签,和数据x维度相同
shadow=1, # 是否有阴影
autopct='%.1f%%', # 默认情况下不显示每个饼块的百分比标注,可以自定义每个饼块的百分比属性
explode=explode) # 默认情况下每个饼块都是彼此相连接的,有时为了突出某一个饼块将其裂开,
# 自定义一个类似于数组的数据来规定每个饼块的爆裂距离
# 将饼图中的字体改成白色
for autotexts in autotexts:
autotexts.set_color('White')
plt.title('3种去学校的方式')
plt.show()