• <学习笔记>从零开始自学Python-之-常用库篇(十二)Matplotlib


            Matplotlib 是Python中类似 MATLAB的绘图工具,Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建2D图表和一些基本的3D图表,可根据数据集(DataFrame,Series)自行定义x,y轴,绘制图形(线形图,柱状图,直方图,密度图,散布图等等),能够解决大部分的需要。Matplotlib中最基础的模块是pyplot。

    1、Matplotlib绘图的基本流程如下:

     2、中文显示问题

    Matplotlib默认是不显示中文的,如果要显示中文,可以用指定字体的办法来设定,在程序开头加入以下两句:

    1. import matplotlib as mpl
    2. mpl.rcParams['font.family']='Kaiti' #设定字体为楷体,当然也可以设为其他字体,只要你电脑里有这个字体就行

    windows常用的字体类型如下:

    中文英文
    黑体SimHei
    微软雅黑Microsoft YaHei
    微软正黑体Microsoft JhengHei
    新宋体NSimSun
    标楷体标楷体
    楷体KaiTi
    仿宋FangSong
    仿宋_GB2312FangSong_GB2312
    楷体_GB2312KaiTi_GB2312
    细明体MingLiU

    3、基本格式,以plot(画线)为例

    3.1 创建一个Figure对象,相当于准备好一个画布

    基本语法:plt. figure(figsize, facecolor),figsize参数可以指定画布大小,像素,单位为英寸。

    3.2 画图,即在画板上作画

    Matplotlib提供了很多种图形的画法,这里我们以plot(画线)为例,语法如下:

    plt.plot(x,y,ls,lw,lable,color)   根据x,y数据绘制直线、曲线、标记点,ls为线型linestyle,lw为线宽linewidth,lable为标签文本内容,color为颜色。

    3.3 保存图形

    plt.savafig()  保存绘制的图形,可以指定图片的分辨率、边缘的颜色等参数。

    plt.show() 在本机显示图形

    3.4 完整代码如下:

    1. import matplotlib as mpl #约定俗成一般把matplotlib简写成 mpl
    2. import matplotlib.pyplot as plt #约定俗成一般把matplotlib.pyplot简写成 plt
    3. mpl.rcParams['font.family']='Kaiti' #设定中文字体为楷体
    4. plt.rcParams['axes.unicode_minus']=False #
    5. plt.figure(figsize=(300,200)) #设定画布大小为300*200
    6. x = [1,2,3,4,5] #X轴的数值
    7. y = [2,4,6,8,10] #Y轴的数值
    8. plt.plot(x, y, label='第一条线') #以x,y的数值对应起来画一条直线,即在图上沿着(1,2)(2,4)(3,6)(4,8)(5,10)这5个点画一条直线
    9. plt.xlabel('时间线') #设定X轴的标签为“时间线”
    10. plt.ylabel('增长值') #设定Y轴的标签为“增长值”
    11. plt.title('增长折线图') #设定整个图形的标签为“增长折线图”
    12. plt.legend() #设置图表的图例
    13. plt.show() #在本机显示图片

    显示的图形如下

     4、常用的2D图形

    4.1 使用plot绘制折线和曲线图

    plot除了画直线图外,还可以画折线图和曲线图

    1. import matplotlib as mpl
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. mpl.rcParams['font.family']='Kaiti'
    5. plt.rcParams['axes.unicode_minus']=False
    6. plt.figure(figsize=(300,200))
    7. x1 = [1,2,3]
    8. y1 = [1,2,3]
    9. plt.plot(x1, y1, label='第一条线')
    10. x2 = [0,1,2,3,4,5]
    11. y2 = [0,3,1,2,3,1]
    12. plt.plot(x2, y2, label='第二条线')
    13. x3 = np.linspace(0, 2*np.pi, 100)
    14. plt.plot(x3, np.sin(x3),'r',label='第三条线')
    15. plt.xlabel('时间线')
    16. plt.ylabel('增长值')
    17. plt.title('plot绘图')
    18. plt.legend()
    19. plt.show()

    效果如下:

    4.2 使用bar()绘制柱状图

    假设用柱状图来展现两个指标进行对比:

    1. import matplotlib as mpl
    2. import matplotlib.pyplot as plt
    3. mpl.rcParams['font.family']='Kaiti'
    4. plt.rcParams['axes.unicode_minus']=False
    5. import matplotlib.pyplot as plt
    6. plt.bar([1,3,5,7,9],[5,2,7,8,2], label="指标一")
    7. plt.bar([2,4,6,8,10],[8,6,2,5,6], label="指标二", color='g'
    8. )
    9. plt.legend()
    10. plt.xlabel('项目')
    11. plt.ylabel('数值')
    12. plt.title('柱状图示意')
    13. plt.show()

    得到图形如下:

    也可以把数据上下对齐,用不同颜色区分柱子,这样对比效果更明显

    1. import matplotlib as mpl
    2. import matplotlib.pyplot as plt
    3. mpl.rcParams['font.family']='Kaiti'
    4. plt.rcParams['axes.unicode_minus']=False
    5. x=[1,2,3,4,5]
    6. y1=[5,2,7,8,2]
    7. y2=[8,6,2,5,6]
    8. #将y2列表变为负数得到列表y3
    9. y3=[-y for y in y2]
    10. print(y3)
    11. #设置颜色
    12. plt.bar(x,y1,facecolor='#FFF68F')
    13. plt.bar(x,y3,facecolor="#9999FF")
    14. # 柱状图注释设置
    15. for i, j in zip(x, y1):
    16. plt.text(i, j, j, ha='center', va='bottom')
    17. for i, j in zip(x, y2):
    18. plt.text(i, -j, j, ha='center', va='top')
    19. plt.title('数据对比')
    20. plt.show()

     效果如下:

    4.3  使用bath()绘制条形图

    和柱状图比较类似,只不过条形图是横过来的

    1. import matplotlib as mpl
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. mpl.rcParams['font.family']='Kaiti'
    5. plt.rcParams['axes.unicode_minus']=False
    6. x = np.arange(4)
    7. y = [6,10,4,5]
    8. y1 = [2,6,3,8]
    9. bar_width = 0.4
    10. tick_label = ["1月","2月","3月","4月"]
    11. plt.barh(x+bar_width,y,bar_width,align="center",color="c",label="项目一",alpha=1)
    12. plt.barh(x,y1,bar_width,align="center",color="b",label="项目二",alpha=1)
    13. plt.yticks(x+bar_width/2,tick_label)
    14. plt.title('条形图')
    15. plt.legend()
    16. plt.show()

    得到图形如下:

     4.4 使用pie()绘制饼图

    1. import matplotlib as mpl
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. mpl.rcParams['font.family']='Kaiti'
    5. plt.rcParams['axes.unicode_minus']=False
    6. import matplotlib.pyplot as plt
    7. import numpy as np
    8. plt.figure(figsize=(6, 6))
    9. x = [25, 45, 69, 30, 80]
    10. plt.pie(x, autopct='%.2f%%', explode=[0,0.1,0,0,0], shadow=True,labels=list('甲乙丙丁戊'))
    11. plt.show()

    效果如下:

    4.5 使用scatter()绘制散点图

    1. import matplotlib as mpl
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. zuobiao1 = np.random.randn(100,2)
    5. zuobiao2 = np.random.randn(100,2)
    6. plt.scatter(
    7. zuobiao1[:,0],
    8. zuobiao1[:,1],
    9. s=80, # 尺寸
    10. c='green', # 颜色
    11. alpha=0.6 # 透明度
    12. )
    13. plt.scatter(
    14. zuobiao2[:,0],
    15. zuobiao2[:,1],
    16. s=50, # 尺寸
    17. c='blue', # 颜色
    18. alpha=0.6 # 透明度
    19. )
    20. plt.show()

    效果如下:

    5、3D绘图

    Matplotlib 已经内置了三维图形,我们需要引入一些模块来实现3D绘图:

    1. from mpl_toolkits.mplot3d import axes3d
    2. import matplotlib.pyplot as plt

    使用 axes3d 是因为它需要不同种类的轴域,以便在三维中实际绘制一些东西。

    1. fig = plt.figure()
    2. ax1 = fig.add_subplot(111, projection='3d')

    在这里,我们像通常一样定义图形,然后我们将 ax1 定义为通常的子图,只是这 次使用 3D 投影。 我们需要这样做,以便提醒 Matplotlib 我们要提供三维数据。 现在让我们创建一些 3D 数据:

    1. theta = np.linspace(-2 * np.pi, 2 * np.pi, 100)
    2. x = np.sin(theta)
    3. y = np.cos(theta)
    4. z = np.linspace(0.5, 1.5, 100)

    我们绘制一个3D折线图的完整代码

    1. from mpl_toolkits.mplot3d import axes3d
    2. import matplotlib.pyplot as plt
    3. from matplotlib import style
    4. import numpy as np
    5. style.use('fivethirtyeight')
    6. fig = plt.figure()
    7. ax1 = fig.add_subplot(111, projection='3d') #创建3d坐标系
    8. theta = np.linspace(-2 * np.pi, 2 * np.pi, 100)
    9. x = np.sin(theta)
    10. y = np.cos(theta)
    11. z = np.linspace(0.5, 1.5, 100)
    12. ax1.plot(x,y,z)
    13. ax1.set_xlabel('x axis')
    14. ax1.set_ylabel('y axis')
    15. ax1.set_zlabel('z axis')
    16. plt.show()

    绘制的图形如下:

    5.2 其他3D图形绘制

    5.2.1 散点图

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. fig = plt.figure()
    4. ax3d = fig.add_subplot(projection='3d') #创建3d坐标系
    5. x = np.random.randn(50)
    6. y = np.random.randn(50)
    7. z = np.random.randn(50)
    8. s = np.random.randn(50)*100
    9. #ax3d.scatter(x,y,z) #绘制3d散点图
    10. #ax3d.scatter(x,y,z,marker=['*','o',...]) #设置不同的点样式
    11. ax3d.scatter(x,y,z,s=s,c=s) #绘制3d散点图
    12. ax3d.scatter(x,y,-3,zdir='z',c='r') #3d坐标系绘制平面散点
    13. plt.show()

    图形如下:

    5.2.2 柱状图

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. fig = plt.figure()
    4. ax3d = fig.add_subplot(projection='3d') #创建3d坐标系
    5. np.random.seed(2023)
    6. x = np.arange(5)
    7. y = np.arange(5)
    8. z = np.zeros(5) #柱子底部坐标
    9. dx=1 #柱子平面宽度
    10. dy=1 #柱子平面深度
    11. dz=np.random.randint(1,15,5) #柱子高度
    12. ax3d.bar3d(x,y,z,dx,dy,dz) #绘制3d柱形图
    13. plt.show()

    图形如下:

    5.2.3 火柴图

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. fig = plt.figure()
    4. ax3d = fig.add_subplot(projection='3d') #创建3d坐标系
    5. np.random.seed(2023)
    6. t=np.linspace(-np.pi,np.pi,50)
    7. x = np.sin(t)
    8. y = np.cos(t)
    9. z = np.linspace(-2,2,50)
    10. ax3d.stem(x,y,z) #绘制3d火柴图
    11. #ax3d.stem(x,y,z,orientation="x", bottom=-2) #火柴根在yz平面
    12. plt.show()

    图形如下

    5.2.4 误差图

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. fig = plt.figure()
    4. ax3d = fig.add_subplot(projection='3d') #创建3d坐标系
    5. np.random.seed(2023)
    6. t=np.linspace(-np.pi,np.pi,50)
    7. x = np.sin(t)
    8. y = np.cos(t)
    9. z = np.linspace(-4,4,50)
    10. zerr=np.random.randn(50)
    11. #ax3d.errorbar(x,y,z,zerr,capsize=2) #只有z方向误差
    12. #ax3d.errorbar(x,y,z,zerr,0.2,0.1,capsize=2) #同时显示zerr,yerr,xerr,注意是三个误差线
    13. ax3d.errorbar(x,y,z,zerr,capsize=2,errorevery=2) #每两个数据点绘制一个误差线。
    14. plt.show()

    图形如下:

    5.2.5 网格面

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. fig = plt.figure()
    4. ax3d = fig.add_subplot(projection='3d') #创建3d坐标系
    5. x,y=np.mgrid[-2:2:0.2,-2:2:0.2]
    6. z = x*np.exp(-x**2-y**2)
    7. #ax3d.plot_wireframe(x,y,z)
    8. #ax3d.plot_wireframe(x,y,z,rstride=2,cstride=2)# 两条线合并为一条线
    9. ax3d.plot_wireframe(x,y,z,rcount=10,ccount=12)#设置最大显示线条数
    10. plt.show()

    图形如下:

    5.2.6 曲面图

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. fig = plt.figure()
    4. ax3d = fig.add_subplot(projection='3d') #创建3d坐标系
    5. x,y=np.mgrid[-3:3:0.2,-3:3:0.2]
    6. z = x*np.exp(-x**2-y**2)
    7. #ax3d.plot_surface(x,y,z)
    8. #ax3d.plot_surface(x,y,z,rstride=2,cstride=2)# 两条线合并为一条线
    9. #ax3d.plot_surface(x,y,z,rcount=16,ccount=18)#设置最大显示线条数
    10. #ax3d.plot_surface(x,y,z,cmap="YlOrRd")
    11. ax3d.plot_surface(x,y,z,cmap="YlOrRd")
    12. plt.show()

    图形如下:

    5.2.7 非结构化三角网格

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. fig = plt.figure()
    4. ax3d = fig.add_subplot(projection='3d') #创建3d坐标系
    5. np.random.seed(2023)
    6. x=np.random.randn(200)*2
    7. y=np.random.randn(200)*2
    8. z = x*np.exp(-x**2-y**2)
    9. #ax3d.tricontour(x,y,z)
    10. ax3d.tricontour(x,y,z,levels=10,cmap="coolwarm")
    11. #ax3d.tricontour(x,y,z,zdir='x',levels=10,cmap="coolwarm") #绘制x方向等值线
    12. plt.show()

    图形如下:

    5.2.8 三维体元素图

    1. import numpy as np
    2. import matplotlib.pyplot as plt
    3. fig = plt.figure()
    4. ax3d = fig.add_subplot(projection='3d')
    5. #filled为bool类型数组,在True的元素下标位置绘制体元素
    6. i,j,k=np.indices((3,3,3))
    7. filled= (i==j) & (j==k) #3行3列3层,对角线为True
    8. c=plt.get_cmap('RdBu')(np.linspace(0,1,27)).reshape(3,3,3,4)
    9. #ax3d.voxels(filled) #filled为True的位置绘制六面体
    10. ax3d.voxels(filled,facecolors=c) #filled为True的位置绘制六面体,并设置颜色
    11. plt.show()

    图形如下:

    6、数据来源

    6.1 从文件加载数据

    1. import matplotlib.pyplot as plt
    2. import csv
    3. import matplotlib as mpl
    4. mpl.rcParams['font.family']='Kaiti'
    5. plt.rcParams['axes.unicode_minus']=False
    6. x = []
    7. y = []
    8. with open('testData.txt','r') as csvfile:
    9. plots = csv.reader(csvfile, delimiter=',')
    10. for row in plots:
    11. x.append(int(row[0]))
    12. y.append(int(row[1]))
    13. plt.plot(x,y, label='月销量趋势图')
    14. plt.xlabel('x')
    15. plt.ylabel('y')
    16. plt.title('从文件中加载数据绘图')
    17. plt.legend()
    18. plt.show()

    除了CSV 模块,也可以使用 NumPy 模块来加载我们的文件和数据

    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. x, y = np.loadtxt('testData.txt', delimiter=',', unpack=True)
    4. plt.plot(x,y, label='月销量趋势图')
    5. plt.xlabel('x')
    6. plt.ylabel('y')
    7. plt.title('使用numpy从文件中加载数据绘图')
    8. plt.legend()
    9. plt.show()

    6.2 从网络加载数据

    我先用自己的服务器定义一个接口,接口回传的数据格式为:

    data={'x':[1,2,3,4,5,6],'y':[2,5,8,9,13,19]}

    然后我们访问接口,获得数据,再根据数据绘图:

    1. import matplotlib.pyplot as plt
    2. import requests
    3. import matplotlib as mpl
    4. mpl.rcParams['font.family']='Kaiti'
    5. plt.rcParams['axes.unicode_minus']=False
    6. url = '这里是API接口的地址'
    7. def get_data(url):
    8. response = requests.get(url)
    9. data = response.json()
    10. x=data['x']
    11. y=data['y']
    12. return x,y
    13. x,y=get_data()
    14. plt.plot(x,y, label='走势图')
    15. plt.xlabel('x')
    16. plt.ylabel('y')
    17. plt.title('使用从网络接口获得的数据')
    18. plt.legend()
    19. plt.show()

    最后图形如下:

  • 相关阅读:
    C语言从头学21——函数
    5G时代全面到来,浅谈移动通信的前世今生
    MySQL数据库基础 09
    RT-DETR优化改进:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023
    lnmp环境安装ffmpeg,并在Yii2中使用
    redis搭建主从、redis搭建集群、redis中StrictRedis()、RedisCluster()方法与python交互
    跨平台代码编写规范——参考《Loup&卡普》的文档
    Java线程池中的基础问题
    redis cook book.notes.
    图解域名解析成IP的全过程(你浏览器摁下一个网址后发生了啥?)
  • 原文地址:https://blog.csdn.net/qq_41597915/article/details/131713421