# python-01 **Repository Path**: wlxu/python-01 ## Basic Information - **Project Name**: python-01 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-29 - **Last Updated**: 2024-04-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README Matplotlib数据可视化 - 笔记 **强大的数据分析可视化工具** image-1 ## 一、Matplotlib基本图形绘制 ### 1. 安装:Python环境 ​ pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple pandas ### 2. 课程介绍 ​ Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一,支持跨平台运行,它是 Python 常用的 2D 绘图库,同时它也提供了一部分 3D 绘图接口, Matplotlib 通常与 **NumPy、Pandas** 一起使用,是数据分析中不可或缺的重要工具之一 ​ 在数据分析和机器学习中, 我们经常要用到大量的可视化操作, 一张制作精美的图片, 可以直观展示数据信息, 字不如表, 表不如图, 一图胜千言, 通过 Matplotlib, 我们可以仅需要几行代码,便可以生成**图表,直方图,条形图,箱型图,散点图**等 ### 3. 导包 ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt ``` ### 4. 配置 ```python # 运行时配置参数 plt.rcParams['font.sans-serif'] = 'SimHei' # 让图片中可以显示中文 plt.rcParams['axes.unicode_minus'] = False # 让图片中可以显示负号 # 查看自己电脑上的字体库 from matplotlib.font_manager import FontManager fm = FontManager() my_fonts = set(f.name for f in fm.ttflist) my_fonts ``` ### 5. 绘制抛物线 ![](./images/2-1.png) ```python # 1、导入所需的第三方包 import numpy as np import pandas as pd import matplotlib.pyplot as plt # 2、运行时配置参数 plt.rcParams['font.sans-serif'] = 'SimHei' # 让图片中可以显示中文 plt.rcParams['axes.unicode_minus'] = False # 让图片中可以显示负号 # 3、绘制抛物线 x = np.linspace(-5, 5, 50) # 等差数列 - -5到5之间 等分成 50份 y = x**2 # 等分X轴多个值,Y轴也是 等成50份 plt.plot(x, y) # 画线形图,或是折线图 plt.show() # 执行显示图形 ``` ### 6. 样式和颜色 常用的样式:'-','--','-.',':','.',',',,o,^,v,<,>,s,+,x,D,d,1,2,3,4,h,H,p,| ,_ 常用的颜色: b(蓝色),g(绿色),r(红色),c(青色),m(品红),y(黄色),k(黑色),w(白色) ![](./images/2-2.png) ```python # 绘制抛物线 x = np.linspace(-5, 5, 50) y = x**2 plt.plot(x, y, c="r", ls=":") # ls: line style 线的样式 # plt.plot(x, y, c = "y:") # 样式和颜色 简写 plt.show() # 执行显示图形 ``` ### 7. 画布配置 ![](./images/2-3.png) ```python # 画布配置 # figsize: 画布大小,宽高 # dpi :分辨率 # facecolor: 背景颜色 fig = plt.figure(figsize=(6, 4), dpi=100, facecolor='#11aa11') # 绘制正弦曲线 x = np.linspace(0, 2*np.pi) y = np.sin(x) plt.plot(x,y) plt.grid() # 设置网格线 plt.show() # 执行显示图形 ``` ### 8. 在一个画布上绘制多个图 ![](./images/2-4.png) ```python # 3、设置画布的大小 fig = plt.figure(figsize=(5, 3)) # 4、绘制多个图 x = np.linspace(0, 8) # X轴的数据 plt.plot(x, np.sin(x)) # Y轴的数据 - 第一条 蓝色 plt.plot(x, np.cos(x), 'r') # Y轴的数据 - 第二条 红色 plt.plot(x, -np.sin(x), 'g--') # Y轴的数据 - 第三条 绿色 plt.show() # 执行显示图表 ``` ### 9. 多图布局 - 均匀分布 subplot() ![](./images/3-1.png) ```python # 3、绘制均匀布局 - 2行2列 fig = plt.figure(figsize=(8, 5)) # 配置画布大小 x = np.linspace(-np.pi, np.pi, 30) # 设置绘图数据 y = np.sin(x) a1 = plt.subplot(2, 2, 1) # 2行2列的第1个子视图 a1.plot(x, y) a1.set_title('子图1') a2 = plt.subplot(2, 2, 2) # 2行2列的第2个子视图 a2.plot(x, y) a2.set_title('子图2') # 2行2列的第3个子视图 # 2行2列的第4个子视图 fig.tight_layout() # 自动调整布局 plt.show() # 执行显示图表 ``` ### 10. 多图布局 - 不均匀分布 subplot() ![](./images/3-2.png) ```python # 3、绘制不均匀布局 fig = plt.figure(figsize=(8, 5)) # 配置画布大小 x = np.linspace(-np.pi, np.pi, 30) # 设置绘图数据 y = np.sin(x) a1 = plt.subplot(2, 2, 1) # 2行2列的第1个 子视图 a1.plot(x, y, color='red') # 设置颜色 a2 = plt.subplot(2, 2, 2) # 2行2列的第2个 子视图 a2.plot(x, y,ls = "--") # 设置样式 a3 = plt.subplot(2, 1, 2) # 2行1列的第2行 一个子图 a3.plot(x, np.sin(x*x), c = "pink") # 绘制新的图,让它和前面的图不一样 fig.tight_layout() # 自动调整布局 plt.show() # 执行显示图表 ``` ### 11. 多图布局 - 均匀发布 subplots() ![](./images/3-5.png) ```python x = np.linspace(0, 2*np.pi) # 设置 X轴的数据 # subplots():一次性返回9个子图 fig, a = plt.subplots(3, 3) # 使用fig a 接收 生成的3行3列 a1, a2, a3 = a # 按行接收 a11, a12, a13 = a1 # 按列接收 a21, a22, a23 = a2 a31, a32, a33 = a3 # fig来设置画布大小 fig.set_figwidth(8) fig.set_figheight(5) # 第一行有三个图 a11.plot(x, np.sin(x)) a12.plot(x, np.cos(x)) a13.plot(x, np.tan(x)) # 第二行有三个图 a21.plot(x, np.tanh(x)) a22.plot(x, np.cosh(x)) a23.plot(x, np.sinh(x)) # 第三行有三个图 a31.plot(x, np.sin(x*x)) a32.plot(x, np.cos(x*x)) a33.plot(x, np.tan(x*x)) # 自动调整布局 plt.tight_layout() plt.show() ``` ### 12.多图布局 - 图形嵌套 #### 1.1 add_subplot()函数 ![](./images/3-3.png) ```python # 3、设置画布的大小 fig = plt.figure(figsize=(8, 5)) # 在画布中 添加图1: 第1行第1列的 第一个图 (会占满整个图) a1 = fig.add_subplot(1, 1, 1) a1.plot([0, 1], [1, 3]) # 两个点 # 在图1中添加 图2:是嵌套图 会将第一个图分成4份 a2 = fig.add_subplot(2, 2, 1, facecolor='pink') a2.plot([0, 1], [1, 3]) fig.tight_layout() # 自动调整布局 plt.show() # 执行显示图表 ``` #### 1.2 使用 axes() & add_axes() 函数 ![](./images/3-4.png) ```python # 3、设置画布的大小 fig = plt.figure(figsize=(8, 5)) x = np.linspace(0, 2*np.pi, 30) # 绘图的数据取值 y = np.sin(x) plt.plot(x, y) # 绘制图1 - sin曲线 # 在图1中添加子图 - 嵌套图1 # [left(左边), bottom(底部), width(宽), height(高)] axes1 = plt.axes([0.55, 0.55, 0.3, 0.3]) # 图的位置,自行调节 - axes axes1.plot(x, y, color='g') # 绘制图表 # 在图1中添加子图 - 嵌套图2 axes2 = fig.add_axes([0.2, 0.2, 0.25, 0.25]) # 图的位置,自行调节 - add_axes axes2.plot(x, y, color='r') plt.show() # 执行显示图表 ``` ### 13.双轴显示 ![](./images/3-6.png) ```python # 3、设置画布大小 plt.figure(figsize=(8, 5)) x = np.linspace(0, 10, 100) # 绘图数据的取值 # 绘制图1:指数函数的图表 axes1 = plt.gca() # 获取当前轴域 axes1.plot(x, np.exp(x), color='r') axes1.set_xlabel('公共的X轴') # 设置X轴的 - 标题 axes1.set_ylabel('指数', color='r') # 设置Y轴的 - 标题 axes1.tick_params(axis='y', labelcolor='r') # Y轴显示数据的颜色 # 绘制图2:绘制的是sin曲线 axes2 = axes1.twinx() # 重点:要定义和图1共享x轴 axes2.plot(x, np.sin(x), color='blue') axes2.tick_params(axis='y', labelcolor='blue') # Y轴显示数据的颜色 axes2.set_ylabel('sin曲线', color='blue') # 设置Y轴的 - 标题 plt.tight_layout() # 自动调整布局 plt.show() # 执行显示图表 ``` ## 二、Matplotlib绘图属性设置 #### 1. 常用函数表 | Pyplot函数 | API方法 | 描述 | | :---------: | :--------------------------: | :----------------------------: | | text() | mpl.axes.Axes.text() | 在Axes对象的任意位置添加文字 | | xlabel() | mpl.axes.Axes.set_xlabel() | 为X轴添加标签 | | ylabel() | mpl.axes.Axes.set_ylabel() | 为Y轴添加标签 | | title() | mpl.axes.Axes.set_title() | 为Axes对象添加标题 | | legend() | mpl.axes.Axes.legend() | 为Axes对象添加图例 | | annnotate() | mpl.axes.Axes.annotate() | 为Axes对象添加注释(箭头可选) | | suptitle() | mpl.figure.Figure.suptitle() | 为Figure对象添加中心化的标题 | #### 2. 图例 ![](./images/4-1.png) ```python # 1、导入所需的第三方包 import numpy as np import pandas as pd import matplotlib.pyplot as plt # 2、运行时配置参数 plt.rcParams['font.sans-serif'] = 'SimHei' # 让图片中可以显示中文 plt.rcParams['axes.unicode_minus'] = False # 让图片中可以显示负号 # 3、设置画布的大小 plt.figure(figsize=(8, 5)) # 4、绘制图表 - 设置图例 方法1 # x = np.linspace(0, 2*np.pi) # plt.plot(x, np.sin(x), label = 'sin') # 正弦曲线 # plt.plot(x, np.cos(x), label = 'cos') # 余弦曲线 # plt.legend() # 显示图例 # 4、绘制图表 - 设置图例 方法2 x = np.linspace(0, 2*np.pi) plt.plot(x, np.sin(x)) # 正弦曲线 plt.plot(x, np.cos(x)) # 余弦曲线 # 自行添加图例的属性 - 为了在绘制多个图形时不让图例挡住图表 plt.legend(['Sin','Cos'], # 图例名称 fontsize=12, # 字体大小 loc='center', # 可以直接写参数名称,也可以写数值 ncol=2, # 图例显示成几列 ,默认是一列 bbox_to_anchor=[0, 1, 1, 0.2] # (x , y , width ,height) 图例的具体位置,根据实际情况设置即可 ) plt.show() # 执行显示图表 ``` **图例 loc** 显示位置的属性 可以 **根据实际绘制需求进行设置**: | 数值 | 参数名称 | 描述 | | :--: | :-------------: | :--------------------------: | | 0 | "best" | 默认 (会自动选择最佳位置) | | 1 | "upper right" | 上方右边 | | 2 | "upper left" | 上方左边 | | 3 | "lower left" | 下方左边 | | 4 | "lower right " | 下方右边 | | 5 | right | 左边 | | 6 | "center left " | 中间左边 | | 7 | "center right " | 中间右边 | | 8 | "lower center" | 下方中间 | | 9 | upper center | 上方中间 | | 10 | center | 中间 | #### 3. 线条属性 线条属性常用的:**color 颜色、linestyle 样式、linewidth 宽度、alpha 透明度、marker 标记、mfc: marker face color 标记的背景颜色** ![](./images/4-2.png) ```python # 4、绘制图表 x = np.linspace(0, 2 * np.pi, 20) # 设置数值 y1 = np.sin(x) # 第一条 :Y轴 y2 = np.cos(x) # 第二条 :Y轴 # 绘制第一个线,并设置属性 plt.plot(x, y1, c='r', marker='o', ls='--', lw=1, mfc='y') # 绘制第二个线,并设置属性 plt.plot(x, y2, c='b', marker='*', ls='-', lw=2, mfc='g', ) # 绘制第三个线,并设置属性 plt.plot(x, y1 - y2, c='y', marker='^', ls='-', lw=3, mfc='b', markersize=10, # 点的大小 alpha=0.5, # 透明度 (0 - 1) 0完全透明看不见,1是没有变化 ) # 绘制第四个线,并设置属性 plt.plot(x, y1 + y2, c='orange', marker='>', ls='-.', lw=4, mfc='y', markersize=10, # 点的大小 markeredgecolor='green', # 点的边缘颜色 markeredgewidth=2 # 点的边缘宽度 ) ``` ```python # 线条属性的分类如下 # ls : line style 线的样式 '-' '--' '-.' ':' # color 颜色 b(蓝色),g(绿色),r(红色),c(青色),m(品红),y(黄色),k(黑色),w(白色) # marker: 标记的样式或点的样式 o,^,v,<,>,s,+,*,D,d,1,2,3,4,h,H,p,| ,_ # mfc: marker facecolor 标记的背景颜色 # lw: line width 线的宽度 # label: 线标签(图例中显示) ``` #### 4. 坐标轴刻度 ​ 可以手动设置坐标轴的刻度取值,对设置的刻度值进行属性参数修改 ![](./images/4-3.png) ```python # 图形绘制 x = np.linspace(0, 10) y = np.sin(x) plt.plot(x,y) # 设置x轴y轴刻度 - 方式一 plt.xticks(np.arange(0, 11, 1)) plt.yticks([-1, 0, 1]) plt.show() ``` ![](./images/4-4.png) ```python # 图形绘制 x = np.linspace(0, 10) y = np.sin(x) plt.plot(x,y) # 设置x轴y轴刻度标签 - 方式二 plt.yticks(ticks=[-1, 0, 1], # 刻度值 labels=['min', '0', 'max'], # 刻度值对应的标签名(显示) fontsize=20, # 文字大小 ha='right', # 水平对齐方式 color='blue' # 颜色 ) plt.xticks(ticks=np.arange(0, 11, 1), fontsize=20, color='red' ) plt.show() ``` #### 5. 坐标轴范围 ​ 可以自行设置坐标轴的 **取值范围**,设置坐标轴数值显示的位置 ![](./images/4-5.png) ```python # sin曲线 x = np.linspace(0, 2*np.pi) y = np.sin(x) plt.plot(x, y, c='r') # 设置坐标轴的范围- 方式一 plt.xlim(-2, 8) # 设置x轴范围 plt.ylim(-2, 2) # # 设置 y轴范围 ``` ![](./images/4-6.png) ```python # sin曲线 x = np.linspace(0, 2*np.pi) y = np.sin(x) plt.plot(x, y, c='r') # 坐标轴范围:[xmin, xmax, ymin, ymax] 手动设置坐标范围 - 方式二 plt.axis([-2, 8, -2, 2]) # 选项 # off : 不显示坐标轴 # equal: 让x轴和y轴 刻度距离相等 # scaled:自动缩放坐标轴和图片适配 # tight:紧凑型自动适配图片 # square:让画布呈现正方形:x轴和y轴宽高相同 plt.axis('square') plt.show() ``` #### 6.标题 和 网格 ![](./images/4-7.png) ```python # 图形绘制 x = np.linspace(0, 10) y = np.sin(x) plt.plot(x, y) # 图的标题 # fontsize : 标题大小 # loc:标题位置: 中间center 左边right 右边 left plt.title('sin曲线', fontsize=20, loc='center') # 网格线 # ls: line style 网格线样式 # lw:line width 网格线宽度 # c: color 网格线颜色 # axis:画哪个轴的网格线,默认x轴和y轴都画 plt.grid(ls='--', lw=0.5, c='gray', axis='y') plt.show() ``` #### 7.标签 ​ 设置X轴和Y轴的标签(标题) ![](./images/4-8.png) ```python # 图形绘制 x = np.linspace(0, 10) y = np.sin(x) plt.plot(x, y) # 坐标轴标签 plt.xlabel('y=sin(x)', fontsize=20, # 文字大小 rotation=0, # 旋转角度 ) plt.ylabel('y=sin(x)', rotation=90, # 旋转角度 horizontalalignment='right', # 水平对齐方式 fontsize=20 ) # 标题 plt.title('正弦曲线') ``` #### 8. 文本 ![](./images/4-9.png) ```python plt.figure(figsize=(8, 5)) x = np.linspace(0, 10, 10) y = np.array([60, 30, 20, 90, 40, 60, 50, 80, 70, 30]) plt.plot(x, y, ls='--', marker='o') # 文字 for a, b in zip(x, y): # 画文本 plt.text( x=a+0.3, # x坐标 y=b+0.5, # y坐标 s=b, # 文字内容,显示Y轴的数值 ha='center', # 水平居中 va='center', # 垂直居中 fontsize=14, # 文字大小 color='r' # 文字颜色 ) plt.show() ``` #### 9. 注释 ![](./images/4-10.png) ```python plt.figure(figsize=(8, 5)) x = np.linspace(0, 10, 10) y = np.array([60, 30, 20, 90, 40, 60, 50, 80, 70, 30]) plt.plot(x, y, ls='--', marker='o') # 注释(标注) plt.annotate( text='最高销量', # 标注的内容 xy=(3, 90), # 标注的坐标点 xytext=(1, 80), # 标注的内容的坐标点 # 箭头样式 arrowprops={ 'width': 2, # 箭头线的宽度 'headwidth': 8, # 箭头头部的宽度 'facecolor': 'blue' # 箭头的背景颜色 } ) ``` #### 10. 保存图片 ![](./images/4-11.png) ```python # 图形绘制 f = plt.figure(figsize=(8, 5)) x = np.linspace(0, 2*np.pi) plt.plot(x, np.sin(x)) plt.plot(x, np.cos(x)) f.savefig( fname='pic_name2.png', # 文件名:png、jpg、pdf dpi=100, # 保存图片像素密度 facecolor='pink', # 背景颜色 pad_inches=1 # 内边距 ) ``` ## 三、Matplotlib常用图表 #### 1. 折线图 ​ 折线图(line chart)是我们日常工作、学习中经常使用的一种图表,它可以直观的反映数据的变化趋势 ##### 1.1 一次画一条线 ![](./images/5-1.png) ```python # 3、设置画布的大小 plt.figure(figsize=(8, 5)) # 4、绘制图表 x = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] y = [20, 40, 35, 55, 42, 80, 50] # 一次画一条线 plt.plot(x, y, c="g", marker='D', markersize=5) # 绘制坐标轴标签 plt.xlabel("星期") plt.ylabel("活跃度") plt.title("Python语言活跃度") # 设置折线图标注的文本 for x1, y1 in zip(x, y): plt.text(x=x1, y=y1, s=str(y1), ha='center', va='bottom', fontsize=16) plt.show() ``` ##### 1.2 一次画多条线 ![](./images/5-2.png) ```python # 3、设置画布的大小 plt.figure(figsize=(8, 5)) # 4、绘制图表 - 一次画多条线 x = np.random.randint(0, 10, 15) # 生成0-到10的随机数 plt.plot(x, marker='*', color='r') plt.plot(x.cumsum(), marker='o', c="b") # 累加求和 # 绘制坐标轴标签 plt.xlabel("X轴") plt.ylabel("Y轴") plt.title("绘制多条线") plt.show() ``` ##### 1.3 读取Excel表的数据 ​ **统计各科成绩变化趋势 - 读取表格的数据绘制图表** ![](./images/5-3.png) ```python df = pd.read_excel('data/plot.xlsx', sheet_name='line') # 无法读取 表格数据 需要安装: pip install openpyxl print(df) # 打印获取到的数据 x, y1, y2, y3 = df['月份'], df['语文'], df['数学'], df['英语'] # 获取所需的数据 plt.figure(figsize=(7, 4)) # 画布大小 # 画折线图 - 三条线 plt.plot(x, y1, label='语文', c='g', ls='--', marker='*', mfc='y', ms=6, alpha=0.5) plt.plot(x, y2, label='数学', c='b', ls='-.', marker='o', mfc='w', ms=5) plt.plot(x, y3, label='英语', c='r', ls=':', marker='>', mfc='w', ms=5, alpha=0.5) plt.yticks(range(0, 110, 10)) # y轴的刻度 plt.ylabel('成绩') plt.xlabel('月份') plt.title('成绩的变化趋势') plt.legend() # 图例 plt.grid(axis='y') # 设置网格 plt.show() ``` #### 2. 柱状图和条形图 ​ 柱状图是一种用矩形柱来表示数据分类的图表,柱状图可以垂直绘制,也可以水平绘制,它的高度与其所表示的数值成正比关系 ##### 2.1 简单柱状图 ![](./images/5-4.png) ```python # 3、画布大小 fig = plt.figure(figsize=(8, 5)) # 4、绘制简单的柱状图 x = ['语文', '数学', '英语', 'Python', '化学'] y = [20, 10, 40, 60, 10] plt.bar(x, y, color='r') # 绘制柱状图 # plt.barh(x, y1) # 条形图 - 反转X轴和Y轴 plt.show() ``` ##### 2.2 读取Excel表 - 柱状图 ![](./images/5-5.png) ```python # 3、读取Excel表中 - bar的数据 df = pd.read_excel('data/plot.xlsx', sheet_name='bar1') print(df) # 打印获取到的数据 - 年份和销售额 x, y = df.年份, df.销售额 # X轴是年份、Y轴是销售额 plt.title('2014年-2020年销售额') # 设置标签 plt.xlabel('年份') plt.ylabel('销售额') plt.bar(x, y, width=0.6) # 柱子的宽度 for a, b in zip(x, y): # 给每个柱形图加上数字 plt.text( x=a, y=b+5e4, s='{:.1f}万'.format(b/10000), # 数值转换单位 ha='center', fontsize=9 ) plt.show() ``` ##### 2.3 读取Excel表 - 多条柱状图 ![](./images/5-6.png) ```python # 3、读取数据 df2 = pd.read_excel('data/plot.xlsx', sheet_name='bar2') x, y1, y2, y3 = df2.年份, df2.北区, df2.中区, df2.南区 # 4、设置标签的值 编写代码 # 5、绘制图表 编写代码 plt.legend() # 显示图例 plt.show() # 显示图表 ``` ##### 2.4 读取Excel表 - 堆叠柱形图 ![](./images/5-7.png) ```python # 3、读取数据 df2 = pd.read_excel('data/plot.xlsx', sheet_name='bar2') x, y1, y2, y3 = df2.年份, df2.北区, df2.中区, df2.南区 # 4、设置标签的值 编写代码 # 5、绘制图表 编写代码 plt.legend() # 显示图例 plt.show() # 显示图表 ``` #### 3. 直方图 ​ 直方图(Histogram),又称**质量分布图**,它是一种条形图的一种,由**一系列高度不等的纵向线段**来表示**数据分布**的情况。 直方图的**横轴表示数据类型**,**纵轴表示分布情况**。 直方图用于**概率分布**,它显示了一组数值序列在给定的数值范围内出现的概率;而柱状图则用于展示各个类别的频数。 ##### 3.1 简单的直方图 ![](./images/5-9.png) ```python # 3、绘制图表 x = np.random.randint(0, 10, 100) # 随机生成 100个数 print(pd.Series(x).value_counts()) # 统计每个数出现的次数 # 直方图 plt.hist(x) # 显示的是每个数出现的次数,分布情况 plt.xticks(range(10)) # 柱形图 # plt.bar(range(100),x) # 使用柱子显示数值大小 # 修改直方图的组数 # plt.hist(x, bins=5) # bins: 组数 # plt.hist(x, bins=[0, 3, 6, 9, 10]) # 控制显示的范围 plt.show() # 显示图表 ``` ##### 3.2 导入数据 - 绘制直方图 ![](./images/5-10.png) ```python # 读取Excel表中 hist数据 - 查看学生成绩的分布情况 # 编写代码 # print(x) # 查看有多少个数值 - 1000个 # plt.hist(x) # 绘制直方图 # plt.show() # 显示图表 # 简单的设置参数属性值 x.min(), x.max() # 获取 X轴的最小值和最大值 plt.hist(x, bins=range(40, 111, 6), facecolor='y', edgecolor='k', alpha=0.4) # edgecolor: 边缘颜色 plt.show() # 显示图表 ``` #### 4. 箱型图 箱型图(也称为盒须图)它能显示出一组数据的**最大值、最小值、中位数**、及上下四分位数。 ![](./images/5-11-1.png) ##### 4.1 一次画一个箱型图 ![](./images/5-11.png) ```python # 3、一次绘制一个箱型图 # x = [1, 2, 3, 5, 7, 9, -10] # plt.boxplot(x) # 绘制箱型图 plt.show() ``` ##### 4.2 一次画多个箱型图 ![](./images/5-12.png) ```python # 4、一次绘制多个箱型图 # x1 = np.random.randint(10, 100, 100) # x2 = np.random.randint(10, 100, 100) # x3 = np.random.randint(10, 100, 100) # plt.boxplot([x1, x2, x3]) # 绘制箱型图 ``` ##### 4.3 箱型图样式 ![](./images/5-13.png) ```python # 5、给箱型图添加样式 data = np.random.normal(size=(500, 4)) # 500行 4列 lables = ['A', 'B', 'C', 'D'] # 设置X轴的标签 # plt.boxplot(data) # 绘制箱型图 没有加样式 plt.boxplot(data, # 绘制箱型图的样式 notch=True, # 箱型图样式 sym='g*', # 颜色+marker样式 labels=lables # x轴标签 ) plt.show() ``` #### 5. 散点图 散点图用于在水平轴和垂直轴上绘制数据点,它表示了因变量随自变量变化的趋势。通俗地讲,它反映的是**一个变量受另一个变量的影响程度** ##### 5.1 绘制简单的散点图 ![](./images/5-14.png) ```python # 3、绘制简单的散点图 x = range(1, 7, 1) y = range(10, 70, 10) plt.scatter(x, y, marker='o') # 散点图 ``` ##### 5.2 绘制气泡图 ![](./images/5-15.png) ```python # 4、绘制气泡图 # plt.figure(figsize=(5, 3)) data = np.random.randn(100, 2) # 100行两列的数,服从正态分布 # plt.scatter(data[:, 0], data[:, 1]) # 第一列为X轴,第二列为X轴 # 在绘制气泡图时设置样式 s = np.random.randint(50, 200, size=100) # 设置尺寸 随机生成 50-200 的数值,size=100 个点 color = np.random.randn(100) # 设置颜色的点数 plt.scatter( data[:, 0], # x坐标 data[:, 1], # y坐标 s=s, # 尺寸 c=color, # 颜色 alpha=0.6 # 透明度 ) ``` ##### 5.3 读取Excel表 - 绘制散点图 ![](./images/5-16.png) ```python # 读取excel表中的 scatter 的数据 # 编写代码 # 绘制散点图 ``` ##### 5.4 读取Excel表 - 绘制六边形图 ![](./images/5-17.png) ```python plt.figure(dpi=100) # 绘制 六边形图 plt.hexbin(x, y, gridsize=20, cmap="rainbow") # gridsize: 网格大小 cmap:颜色映射 rainbow: 彩虹色 ``` #### 6. 饼图 ​ 饼状图用来显示一个数据系列,具体来说,饼状图显示**一个数据系列中各项目的占项目总和的百分比**。 ##### 6.1 绘制简单的饼图 ![](./images/5-18.png) ```python x = [10, 20, 30, 40] plt.pie(x, autopct='%.1f%%') plt.show() ``` ##### 6.2 读取Excel表 - 绘制饼图 ![](./images/5-19.png) ```python # 4、读取Excel表 - 绘制饼图 # 绘制饼图 - 设置属性 plt.pie( x=values, # 数值 autopct='%.1f%%', # 百分比 pctdistance=0.8, # 百分比文字的位置 labels=province, # 标签 labeldistance=1.1, # 标签的位置 textprops={'fontsize': 12, 'color': 'k'}, # 字体样式 explode=[0, 0, 0, 0.1, 0, 0.1, 0, 0, 0, 0], # 分裂效果 # shadow=True # 阴影 ) ``` ##### 6.3 读取Excel表 - 绘制单个圆环 ![](./images/5-20.png) ```python # 5、 读取Excel表 - 绘制单个圆环 plt.pie( x=values, # 数值 autopct='%.1f%%', # 百分比 pctdistance=0.8, # 百分比文字的位置 labels=province, # 标签 labeldistance=1.1, # 标签的位置 textprops={'fontsize': 10, 'color': 'k'}, # 字体样式 wedgeprops={'width': 0.4, 'edgecolor': 'w'} # 单个圆环设置 ) ``` ##### 6.4 读取Excel表 - 绘制多个圆环 ![](./images/5-21.png) ```python # 6、读取Excel表 - 绘制多个圆环 # 编写代码 # 绘制饼图 1 # 绘制饼图 2 # 设置图例 ``` #### 7. 面积图 面积图又称**区域图**,和**折线图**差不多,强调**y轴随x轴而变化的程度**,可用于引起人们对总值趋势的注意 ##### 7.1 绘制简单的面积图 ![](./images/5-22.png) ```python # 3、绘制简单的面积图 x = [1, 2, 3, 4, 5] y = np.random.randint(10, 100, 5) plt.stackplot(x, y) # 绘制面积图 plt.plot(x, y) # 绘制折线图 ``` ##### 7.2 读取Excel表 - 销售额趋势 ![](./images/5-23.png) ```python # 4、读取Excel表 - 销售额趋势 # 绘制面积图 # 设置标题 # 设置X轴和Y轴的标签 ``` #### 8. 热力图 热力图是一种通过**对色块着色**来显示数据的**统计图表**。绘图时,需指定**颜色映射**的规则。 **读取Excel中的数据 - 绘制热力图** ![](./images/5-24.png) ```python # 3、读取Excel中的数据 - 绘制热力图 df = pd.read_excel('data/plot.xlsx', sheet_name='imshow') data = df.drop(columns='省份').values # 使用drop() 指定删除某一列的方法 # print(data) # 打印没有省份的数据 y = df['省份'] # 取出省份 - Y轴的值 # print(y) # x = df.columns[1:] # 取出X轴的值 x = df.drop(columns='省份').columns # print(x) plt.figure(figsize=(10, 8)) # plt.imshow(data) # 绘制热力图 # 绘制热力图 - 设置属性 plt.imshow(data, cmap='rainbow') # cmap:颜色映射 rainbow 彩虹色 、Blues 蓝色 plt.xticks(range(len(x)), x) # 设置坐标轴刻度 plt.yticks(range(len(y)), y) # 添加文字 for i in range(len(x)): # 遍历列 for j in range(len(y)): # 遍历行 plt.text(x=i, y=j, s=data[j, i], # 先取行,再取列 ha='center', va='center', fontsize=12 ) plt.colorbar() # 颜色条 plt.show() ``` #### 9. 极坐标图 ​ 极坐标系是一个二维坐标系统,该坐标系统中任意位置可由一个夹角和一段相对原点—极点的距离来表示,使用的比较少 ![](./images/5-25.png) ```python # 3、绘制极坐标图 N = 8 # 分成8份 # 360度等分成8份 endpoint=False 不包含终点 x = np.linspace(0, 2*np.pi, N, endpoint=False) # 数值是随机的 size=N 分成8份 height = np.random.randint(3, 15, size=N) width = 2*np.pi / N # 宽度 colors = np.random.rand(8, 3) # 随机的RGB颜色 # polar表示极坐标 ax = plt.subplot(111, projection='polar') ax.bar(x=x, height=height, width=width, color=colors) # 设置属性 plt.show() ``` #### 10. 雷达图 ​ 雷达图是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式**显示多变量数据**的图形方法 ![](./images/5-26.png) ```python fig = plt.figure(figsize=(6, 6)) x = np.linspace(0, 2*np.pi, 6, endpoint=False) y = [83, 61, 95, 67, 76, 88] # 保证首位相连 x = np.concatenate((x, [x[0]])) y = np.concatenate((y, [y[0]])) # 雷达图 axes = plt.subplot(111, polar=True) axes.plot(x, y, 'o-', linewidth=2) # 连线 axes.fill(x, y, alpha=0.3) # 填充 # 显示刻度 axes.set_rgrids([20, 40, 60, 80], fontsize=14) plt.show() ``` #### 11. Matplotlib 3D图 ##### 11.1 三维折线图 ![](./images/6-1.png) ```python # 3D引擎 from mpl_toolkits.mplot3d.axes3d import Axes3D fig = plt.figure(figsize=(8, 5)) # 设置画布 x = np.linspace(0, 100, 400) # 数据 y = np.sin(x) z = np.cos(x) # 3、三维 - 折线图 axes = Axes3D(fig, auto_add_to_figure=False) # 设置属性 fig.add_axes(axes) axes.plot(x,y,z) ``` ##### 11.2 三维散点图 ![](./images/6-2.png) ```python from mpl_toolkits.mplot3d.axes3d import Axes3D fig = plt.figure(figsize=(8, 5)) # 三维折线图 axes = Axes3D(fig, auto_add_to_figure=False) fig.add_axes(axes) # 三维散点图 x = np.random.rand(50) y = np.random.rand(50) z = np.random.rand(50) axes.scatter(x, y, z, color='red', s=100) ``` ##### 11.3 三维柱形图 ![](./images/6-3.png) ```python from mpl_toolkits.mplot3d.axes3d import Axes3D fig = plt.figure(figsize=(8, 5)) # 二维变成了三维 axes = Axes3D(fig, auto_add_to_figure=False) fig.add_axes(axes) # 5、三维 - 柱状图 x = np.arange(1, 5) for m in x: axes.bar( np.arange(4), # 设置4份数值 np.random.randint(10, 100, size=4), zs=m, # 在x轴中的第几个 四组图 zdir='x', # 在哪个方向上排列 alpha=0.7, # 透明度 width=0.5 # 宽度 ) axes.set_xlabel('X轴', fontsize=18, color='red') axes.set_ylabel('Y轴', fontsize=18, color='blue') axes.set_zlabel('Z轴', fontsize=18, color='green') plt.show() ``` #### 12.Matplotlib 图像处理 ```python # 3、读取图片里面的数据 img = plt.imread('data/pandas.jpeg') # print(img) a = img.shape print(a) # 图片大小 - (583, 1024, 3) 高度、宽度、像素点图片的值 plt.imshow(img) # 显示图片 # plt.imshow(img, origin='lower') # 垂直翻转显示 # plt.imshow(img[::-1]) # plt.imshow(img[:, ::-1]) # 水平翻转 # plt.imshow(img[100:400:, 600:]) # 裁剪图片 # 将截取之后的图片,重新保存图片 img1 = img[100:400:, 600:] img2 = img1.shape plt.imsave('data/pandas.png', img1) plt.show() ```