Matplotlib库详解

绘制简单的图形

我们使用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()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07F5mo6b-1674903203097)(output_5_0.png)]

范例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()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2qLcH488-1674903203097)(output_7_0.png)]

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()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ndkTBjFC-1674903203098)(output_11_0.png)]

范例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()

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值