数据可视化-matplotlib-note

matplotlib

第一部分 课程介绍

  • pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

  • 在数据分析与机器学习中,我们经常要用到大量的可视化操作。一张制作精美的数据图片,可以展示大量的信息,一图顶千言。

  • 而在可视化中,Matplotlib算得上是最常用的工具。Matplotlib 是 python 最著名的绘图库,它提供了一整套 API,十分适合绘制图表,或修改图表的一些属性,如字体、标签、范围等。

  • Matplotlib 是一个 Python 的 2D 绘图库,它交互式环境生成出版质量级别的图形。通过 Matplotlib这个标准类库,开发者只需要几行代码就可以实现生成绘图,折线图、散点图、柱状图、饼图、直方图、组合图等数据分析可视化图表。

第二部分 基础知识

Matplotlib 三层结构

  • 1.容器层 : 画板层 画布层plt.figure()

    • 绘图区/坐标系axes: plt.subplots() x、y轴张成的区域
  • 2.辅助显示层 横纵坐标,网格等 辅助显示

  • 3.图像层 指的是不同的同,如折线图,柱状图等

  • 注:2 , 3 置于 1 之上

  • 常见图表的使用

    • 折线图 (plot)
      • 适用于连续数据 变量之间随时间变化趋势
    • 散点图 (scatter)
      • 适用于离散数据 变量之间是否存在数量关联趋势 关系/规律
    • 柱状图 (bar)
      • 适用于离散数据 统计和比较数据之间的差别 统计/对比
    • 直方图 (histogram)
      • 适用于连续数据 展示一组或者多组数据的分布 分布状况
    • 饼图(pie)
      • 适用于分类数据 展示不同分类的占比情况 占比

中文显示问题、常见问题

# 查找字体
from matplotlib import font_manager
fm = font_manager.FontManager()
[font.name for font in fm.ttflist]

# 设置中文字体
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['font.family'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负数标签 
# plt.rcParams['font.size'] = 18

# 查找颜色
plt.colormaps()
# 生成数据
import numpy as np
import pandas as pd

图形绘制

  • 准备数据 - x/y
  • 创建画布 - figure
  • 绘制图像 - plt
  • 辅助显示 - plt
# 需求:画出城市11点到23点1小时内每分钟的温度变化折线图,温度范围在15度-18度
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import random


# 1.准备数据 x  y
x = range(60)
y_shanghai =  [random.uniform(15,18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]


# 2.创建画布
plt.figure(figsize=(15,5),dpi=80)


# 3.绘制图像
# 颜色字符 r g b w c m y k  风格字符 -  --  -.   :  ''
plt.plot(x,y_shanghai,color="r",linestyle = "--",label="上海")
plt.plot(x,y_beijing,color="b",linestyle="-",label="北京")

#显示图例 ---》label ="上海" ,label = "北京"
#位置 0  1  2  3   4   5   6   7   8   9 
#位置 upper   low   center   +    left   right   /  best  
# plt.legend(loc = 0)
plt.legend(loc="upper right")

#修改x,y刻度值
#准备x的刻度说明
x_lable = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5],x_lable[::5])
plt.yticks(range(0,41,5))

#添加网格显示
plt.grid(linestyle="--",alpha=0.5)

#添加描述信息
plt.xlabel("时间变化")
plt.ylabel("温度变化")
plt.title("上海、北京11点到12点的温度变化状况")

# 4.显示图像
plt.show()

png

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 1.准备数据 x  y
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x ]
y_beijing  = [random.uniform(1,3)   for i in x ]

# 2.创建画布
plt.figure(figsize=(10,5),dpi=50)
#一行两列
figure , axes = plt.subplots(nrows = 1 ,ncols = 2 
                             ,figsize=(10,5),dpi=80)

# 3.绘制图像
axes[0].plot(x,y_shanghai,color = "r",linestyle="--",label="上海")
axes[1].plot(x,y_beijing,color="b",linestyle="-",label = "北京")

#显示图例 ---》label ="上海" ,label = "北京"
#位置 0  1  2  3   4   5   6   7   8   9 
#位置 upper   low   center   +    left   right   /  best  
# plt.legend(loc = 0)
axes[0].legend(loc="upper right")
axes[1].legend(loc=0)

#添加网格显示
axes[0].grid(linestyle="--",alpha=0.3)
axes[1].grid(linestyle="-",alpha = 0.4)

# 添加刻度
x_lable = ["12:{}".format(i)  for i in x ]
axes[0].set_xticks(x[::5],x_lable[::5])
axes[0].set_yticks(range(0,41,5))
axes[1].set_xticks(x[::5],x_lable[::5])
axes[1].set_yticks(range(0,41,5))


# 添加描述信息
axes[0].set_xlabel("时间变化")
axes[0].set_ylabel("温度变化")
axes[0].set_title("上海12点到13点的温度变化状况")
axes[1].set_xlabel("时间变化")
axes[1].set_ylabel("温度变化")
axes[1].set_title("北京12点到13点的温度变化状况")

plt.show()

png

网格线 - grid

# 图形绘制
# 1.准备数据
import numpy as np
import pandas as pd
import matplotlib.pyplot  as plt
x = np.linspace(0,2*np.pi) # x轴
y = np.sin(x) # y轴 - 正弦 
y2 = np.cos(x)
# 2 创建画布
plt.figure(figsize=(9,6),dpi=100)

# 3.绘制图像
plt.plot(x,y)
plt.plot(x,y2)

# 4.设置网格线
plt.grid(linestyle = '--',# 样式
         color = 'green',# 颜色
         alpha = 0.75) # 透明度
png

坐标轴范围、刻度、标签、标题

  • 坐标轴范围 - xlim/ylim
  • 坐标轴刻度 - xticks/yticks
  • 坐标轴标签 - xlabel/ylabes
  • 坐标轴标题 - title
# 图形绘制
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 1.准备数据
x = np.linspace(0,2*np.pi) # x轴
y = np.sin(x) # y轴 - 正弦 

# 2 创建画布 - figure
plt.figure(figsize=(9,6),dpi=100)

# 3.绘制图像
plt.plot(x,y)
plt.plot(x,y2)

# 4.设置网格线 - grid
plt.grid(linestyle = '--',# 样式
         color = 'green',# 颜色
         alpha = 0.75) # 透明度

# 5.设置坐标轴范围、刻度、标签、标题
# 5.1设置坐标轴范围 - xlim/ylim
plt.xlim([0,np.pi*2])
plt.ylim([-1,1])

# 5.2 设置坐标轴刻度 - xticks/yticks
# 5.2.1设置坐标刻度 x轴y 轴刻度
plt.xticks(np.arange(0,7,np.pi/2))
plt.yticks([-1,0,1])
# 5.2.2 设置标签版
_ = plt.xticks(ticks=np.arange(0,7,np.pi/2),
               labels = ['0',r'$\frac{\pi}{2}$',r'$\pi$',
                        r'$\frac{3\pi}{2}$',r'$2\pi$'],
               fontsize = 20, # 字体大小
               fontweight = 'normal', # 字体粗细
               color = 'red' # 字体颜色
                     )
_ = plt.yticks(ticks=[-1,0,1],   fontsize = 20, fontweight = 'normal', color = 'green' )

# 5.3 设置坐标轴标签 - xlabel/ylabel
_ = plt.xlabel('X')
_ = plt.ylabel('f(x) = sin(x)',rotation = 0,# 字体旋转 0 水平 1 竖直
           horizontalalignment = 'right', # 字体移动位置
           fontstyle = 'normal',fontsize=20)

# 6.显示标题 - title
_ = plt.title('三角函数',fontstyle = 'normal',fontsize=20)
png

图例 - legend

# 图形绘制
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 1.准备数据
x = np.linspace(0,2*np.pi) # x轴
y = np.sin(x) # y轴 - 正弦 

# 2 创建画布 - figure
plt.figure(figsize=(9,6),dpi=100)

# 3.绘制图像
plt.plot(x,y)
plt.plot(x,y2)

# 4.设置网格线 - grid
plt.grid(linestyle = '--',# 样式
         color = 'green',# 颜色
         alpha = 0.75) # 透明度

# 5.设置坐标轴范围、刻度、标签、标题
# 5.1设置坐标轴范围 - xlim/ylim
plt.xlim([0,np.pi*2])
plt.ylim([-1,1])

# 5.2 设置坐标轴刻度 - xticks/yticks
# 5.2.1设置坐标刻度 x轴y 轴刻度
plt.xticks(np.arange(0,7,np.pi/2))
plt.yticks([-1,0,1])
# 5.2.2 设置标签版
_ = plt.xticks(ticks=np.arange(0,7,np.pi/2),
               labels = ['0',r'$\frac{\pi}{2}$',r'$\pi$',
                        r'$\frac{3\pi}{2}$',r'$2\pi$'],
               fontsize = 20, # 字体大小
               fontweight = 'normal', # 字体粗细
               color = 'red' # 字体颜色
                     )
_ = plt.yticks(ticks=[-1,0,1],   fontsize = 20, fontweight = 'normal', color = 'green' )

# 5.3 设置坐标轴标签 - xlabel/ylabel
_ = plt.xlabel('X',fontsize=20)
_ = plt.ylabel('f(x) = sin(x)',rotation = 0,# 字体旋转 0 水平 1 竖直
           horizontalalignment = 'right', # 字体移动位置
           fontstyle = 'normal',fontsize=20)

# 6.显示标题 - title
_ = plt.title('三角函数',fontstyle = 'normal',fontsize=20)

# 7.图列 - legend - 根据绘制顺序
_ = plt.legend(['sin','cos'],# 不同图的标签
           fontsize=18,# 字体大小
           loc = 'lower right', # 所在位置
           ncol = 2,     # 按行展示  - 根据图的数量
           bbox_to_anchor = [0,1.05,1,0.2] # x y  # x,y,widht,height
          )
png

图片保存 - savefig

# 图形绘制
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 1.准备数据
x = np.linspace(0,2*np.pi) # x轴
y = np.sin(x) # y轴 - 正弦 

# 2 创建画布 - figure
plt.figure(figsize=(9,6),dpi=100)

# 3.绘制图像
plt.plot(x,y)
plt.plot(x,y2)

# 4.设置网格线 - grid
plt.grid(linestyle = '--',# 样式
         color = 'green',# 颜色
         alpha = 0.75) # 透明度

# 5.设置坐标轴范围、刻度、标签、标题
# 5.1设置坐标轴范围 - xlim/ylim
plt.xlim([0,np.pi*2])
plt.ylim([-1,1])

# 5.2 设置坐标轴刻度 - xticks/yticks
# 5.2.1设置坐标刻度 x轴y 轴刻度
plt.xticks(np.arange(0,7,np.pi/2))
plt.yticks([-1,0,1])
# 5.2.2 设置标签版
_ = plt.xticks(ticks=np.arange(0,7,np.pi/2),
               labels = ['0',r'$\frac{\pi}{2}$',r'$\pi$',
                        r'$\frac{3\pi}{2}$',r'$2\pi$'],
               fontsize = 20, # 字体大小
               fontweight = 'normal', # 字体粗细
               color = 'red' # 字体颜色
                     )
_ = plt.yticks(ticks=[-1,0,1],   fontsize = 20, fontweight = 'normal', color = 'green' )

# 5.3 设置坐标轴标签 - xlabel/ylabel
_ = plt.xlabel('X',fontsize=20)
_ = plt.ylabel('f(x) = sin(x)',rotation = 0,# 字体旋转 0 水平 1 竖直
           horizontalalignment = 'right', # 字体移动位置
           fontstyle = 'normal',fontsize=20)

# 6.显示标题 - title
_ = plt.title('三角函数',fontstyle = 'normal',fontsize=20)

# 7.图列 - legend - 根据绘制顺序
_ = plt.legend(['sin','cos'],# 不同图的标签
           fontsize=18,# 字体大小
           loc = 'lower right', # 所在位置
           ncol = 2,     # 按行展示  - 根据图的数量
           bbox_to_anchor = [0,1.05,1,0.2] # x y  # x,y,widht,height
          )
# 展示图片 - 这个放在最后,保存图片要在这个前面
# plt.show() 

# 8.保存图片
# plt.tight_layout() # 自动调整布局空间,就不会出现图片保存不完整
plt.savefig('data/1.png', # 文件名:png、jpg、pdf
            dpi = 100, # 保存图片像素密度
            facecolor = 'violet', # 视图与边界之间颜色设置
            edgecolor = 'lightgreen', # 视图边界颜色设置
            bbox_inches = 'tight')# 保存图片完整

png

脊柱移动

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi,np.pi,50)
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(9,6),facecolor='orange')

# plot绘制了两个图形,x-y成对出现,可以!!!
#    plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
plt.plot(x,np.sin(x),x,np.cos(x),color = 'cyan')

# # 获取当前子视图
ax = plt.gca() # 获取当前视图  get
# ax = plt.sca() # 设置当前视图 Axes/figure set
ax.set_facecolor(np.random.rand(3)) # 该表视图的颜色

# 脊柱消失 - 右边 + 上面 - 设置为白色
ax.spines['right'].set_color('white') # 白色
ax.spines['top'].set_color('#FFFFFF') # rgb白色

# 脊柱消失 - 右边 + 上面 - 设置为透明色
ax.spines['right'].set_alpha(0)
ax.spines['top'].set_alpha(0)


# 设置下面左边脊柱位置,data表示数据,axes表示相对刻度的位置
ax.spines['bottom'].set_position(('data',0)) # 居中
ax.spines['left'].set_position(('data',0))   # 居中

# 设置新的刻度
plt.yticks([-1,0,1],labels=['-1','0','1'],fontsize = 18)
_ = plt.xticks([-np.pi,-np.pi/2,np.pi/2,np.pi],
           labels=[r'$-\pi$',r'$-\frac{\pi}{2}$',r'$\frac{\pi}{2}$',r'$\pi$'],
           fontsize = 18)

plt.grid()

plt.savefig('data/2.pdf',dpi = 300)
png

风格和样式

颜色、线形、点形、线宽、透明度

  • 颜色 - color rgb(255,255,0) - 名称
  • 线形 - ls : - -- -. :
  • 线宽 - linewidth
  • 透明度 - alpha
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi,20)
y1 = np.sin(x)
y2 = np.cos(x)

# 设置颜色,线型,点型
# color: rgb颜色表示 256 0 ~ 255 
#        0 、1、2……A、B、C、D、E、F  16进制      
#        0 ~ 1之间
#        查看: plt.colormaps()
    
# ls: - 实线 -- 虚线 -. 点
# marker:p o
# linewidth:线宽
# alpha:透明度

# 参数连用:颜色 标记形状 线的类型

plt.plot(x,y1,color = 'indigo',ls = '-.',marker = 'p')
plt.plot(x,y2,color = '#FF00EE',ls = '--',marker = 'o')
plt.plot(x,y1 + y2,color = (0.2,0.7,0.2),marker = '*',ls = ':')
plt.plot(x,y1 + 2*y2,linewidth = 3,alpha = 0.7,color = 'orange') # 线宽、透明度
# b --- blue o marker圆圈, --虚线
plt.plot(x,2*y1 - y2,'bo--') # 参数连用
png

其它设置

import numpy as np
import pandas as pd

def f(x):
    return np.exp(-x) * np.cos(2*np.pi*x)

x = np.linspace(0,5,50)
plt.figure(figsize=(9,6))


# plot 参数
plt.plot(x,f(x),color = 'purple',
         marker = 'o', # marker
         ls = '--', # 样式
         lw = 2, # 线宽
         alpha = 0.6,#t透明度
         markerfacecolor = 'red',# 点颜色
         markersize = 10,# 点大小
         markeredgecolor = 'green',#点边缘颜色
         markeredgewidth = 3)#点边缘宽度


plt.xticks(size = 18) # 设置刻度大小
_ = plt.yticks(size = 18)
png

第四部分 多图布局

  • gca - 获取当前视图
  • sca - 设置当前视图

子视图

  • subplot - 不均匀 - 切片/subplot2grid
  • subplots - 均匀

子视图 - subplot

  • 创建多个子图
  • 按照 行 列 视图位置顺序
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi,np.pi,50)
y = np.sin(x)
plt.figure(figsize=(9,6))

# 子视图1 - 2行,2列,1第一个图
ax = plt.subplot(2,2,1) # 两行两列第一个子视图
_ = ax.plot(x,y,color='red')
ax.set_facecolor('green') # 调用子视图设置方法,设置子视图整体属性

# 子视图2
# 后面这个2就是编号,从1,开始
# 1,2
#,3,4

ax = plt.subplot(2,2,2)             # 两行两列第二个子视图
# A list of lines representing the plotted data.
line, = ax.plot(x,-y)                # 返回绘制对象  
line.set_marker('*')                # 调用对象方法 ,设置属性
line.set_markerfacecolor('red')     # 设置标记的颜色 - 内部
line.set_markeredgecolor('green')   # 设置标记的边缘颜色
line.set_markersize(10)             # 设置标记大小

# 子视图3
# ax = plt.subplot(2,1,2) # 两行一列第二行视图
ax = plt.subplot(2,2,(3,4))
plt.sca(ax) # 设置当前视图
x = np.linspace(-np.pi,np.pi,200)
plt.plot(x,np.sin(x*x),color = 'red')
png

子视图 - subplots

  • 使用索引按照行列取值
  • axes[row,col].plot()
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi,np.pi,50)
y = np.sin(x)
fig ,ax = plt.subplots(2,2,figsize=(9,6)) # 两行两列四个视图

# 索引,0开始
ax[0,0].plot(x,np.sin(x),color = 'red')

ax[0,1].plot(x,np.sin(x),color = 'green')

ax[1,0].plot(x,np.cos(x),color = 'purple')

ax[1,1].plot(x,np.cos(x))
png

嵌套

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi,np.pi,25)
y = np.sin(x)
fig = plt.figure(figsize=(9,6)) # 创建视图
plt.plot(x,y)

# 嵌套方式一:axes轴域(横纵坐标范围),子视图
# x,y,width,height
ax = plt.axes([0.2,0.55,0.3,0.3]) # 参数含义[left, bottom, width, height]
ax.plot(x,y,color='g')

# 嵌套方式二 给绝体对象条件子视图
ax = fig.add_axes([0.55,0.2,0.3,0.3]) # 使用视图对象添加子视图
ax.plot(x,y,color = 'r')
png

多图布局

均匀布局 -subplots

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi)
# sharex:所有小图共享x轴  sharey:表示所有小图共享y轴  坐标轴以所有小图中范围最大的进行显示
fig, ((ax11,ax12,ax13), (ax21,ax22,ax23),(ax31,ax32,ax33)) = plt.subplots(3, 3)
# 也可通过plt.subplot() 一个个添加子视图
fig.set_figwidth(9)
fig.set_figheight(6)

# 第一行
ax11.plot(x,np.sin(x))
ax12.plot(x,np.cos(x))
ax13.plot(x,np.tanh(x))

# 第二行
ax21.plot(x,np.tan(x))
ax22.plot(x,np.cosh(x))
ax23.plot(x,np.sinh(x))

# 第三行
ax31.plot(x,np.sin(x) + np.cos(x))
ax32.plot(x,np.sin(x*x) + np.cos(x*x))
ax33.plot(x,np.sin(x)*np.cos(x))

# 紧凑显示,边框会比较小,可以注释掉该行查看效果
plt.tight_layout()
plt.show()
png

不均匀分布

  • 方式1(推荐)
  • 方式2(推荐)
  • 方式3
方式一 - 切片
import numpy as np
import matplotlib.pyplot as plt

# 需要导入gridspec模块
x = np.linspace(0,2*np.pi,200)
fig = plt.figure(figsize=(12,9))

# 使用切片方式设置子视图
ax1 = plt.subplot(3,1,1) # 视图对象添加子视图
ax1.plot(x,np.sin(10*x))
# 设置ax1的标题,xlim、ylim、xlabel、ylabel等所有属性现在只能通过set_属性名的方法设置
ax1.set_title('ax1_title')  # 设置小图的标题


ax2 = plt.subplot(3,3,(4,5)) # 第 4,5位置
ax2.set_facecolor('green')
ax2.plot(x,np.cos(x),color = 'red')

 
ax3 = plt.subplot(3,3,(6,9)) # 第 6,9位置
ax3.plot(x,np.sin(x) + np.cos(x))

ax4 = plt.subplot(3,3,7)
ax4.plot([1,3],[2,4])

ax5 = plt.subplot(3,3,8)
ax5.scatter([1,2,3], [0,2,4])
ax5.set_xlabel('ax5_x',fontsize = 12)
ax5.set_ylabel('ax5_y',fontsize = 12)
plt.show()
png

方式二 - subplot2grid
  • ax = plt.subplot2grid()
  • 参数
    • shape 形状大小 - (3,3)
    • loc 起始位置 - 定位 (0,0)
    • colspan 3
    • rowspan 2
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi,100)
plt.figure(figsize=(12,9))

# 子视图1
ax1 = plt.subplot2grid(shape = (3, 3),# 布局形状
                       loc =  (0, 0), # 布局绘制位置
                       colspan=3) # 跨几列
ax1.plot(x,np.sin(10*x))
# 设置ax1的标题,xlim、ylim、xlabel、ylabel等所有属性现在只能通过set_属性名的方法设置
ax1.set_title('ax1_title')  # 设置小图的标题

# 子视图2
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2) # 跨两列
ax2.set_facecolor('green')
ax2.plot(x,np.cos(x),color = 'red')

# 子视图3
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2) # 跨两行
ax3.plot(x,np.sin(x) + np.cos(x))

# 子视图4
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax4.plot([1,3],[2,4])
# 子视图5
ax5 = plt.subplot2grid((3, 3), (2, 1))
ax5.scatter([1,2,3], [0,2, 4])
ax5.set_xlabel('ax5_x',fontsize = 12)
ax5.set_ylabel('ax5_y',fontsize = 12)
png

方式三
import numpy as np
import matplotlib.pyplot as plt
# 需要导入gridspec模块
import matplotlib.gridspec as gridspec
x = np.linspace(0,2*np.pi,200)
fig = plt.figure(figsize=(12,9))
# 将整个视图分成3x3布局
gs = gridspec.GridSpec(3, 3)

# 使用切片方式设置子视图
ax1 = fig.add_subplot(gs[0,:]) # 视图对象添加子视图
ax1.plot(x,np.sin(10*x))
# 设置ax1的标题,xlim、ylim、xlabel、ylabel等所有属性现在只能通过set_属性名的方法设置
ax1.set_title('ax1_title')  # 设置小图的标题
ax2 = plt.subplot(gs[1, :2]) # 模块调用
ax2.set_facecolor('green')
ax2.plot(x,np.cos(x),color = 'red')
# 从第一行到最后,占1、2两行,后面的2表示只占用第二列,也就是最后的一列
ax3 = plt.subplot(gs[1:, 2])
ax3.plot(x,np.sin(x) + np.cos(x))
# 倒数第一行,只占第0列这一列
ax4 = plt.subplot(gs[-1, 0])
ax4.plot([1,3],[2,4])
# 倒数第一行,只占倒数第二列,由于总共三列,所以倒数第二列就是序号1的列
ax5 = plt.subplot(gs[-1, -2])
ax5.scatter([1,2,3], [0,2, 4])
ax5.set_xlabel('ax5_x',fontsize = 12)
ax5.set_ylabel('ax5_y',fontsize = 12)
plt.show()

png

双轴显示

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi,np.pi,100)
data1 = np.exp(x)
data2 = np.sin(x)
plt.figure(figsize=(9,6))
plt.rcParams['font.size'] = 16 # 设置整体字体大小
ax1 = plt.gca() # 获取当前轴域

# 第一个y轴
ax1.set_xlabel('time (s)',loc='center',color='g') # 设置x轴标签
ax1.set_ylabel('exp' ,color='red',rotation = 0, horizontalalignment = 'right') # 字体移动) # 设置y轴标签
ax1.plot(x, data1, color='red') # 数据绘制
ax1.tick_params(axis='y', labelcolor='red') # 设置y轴刻度属性

# 第二个y轴
ax2 = ax1.twinx()  # 创建新axes实例,共享x轴,并设置
ax2.set_ylabel('sin', color='blue')
ax2.plot(x, data2, color='blue')
ax2.tick_params(axis='y', labelcolor='blue')

plt.tight_layout() # 紧凑布局
png

第五部分 文本、注释、箭头

常用函数如下:

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对象添加注释(箭头可选)
figtext() mpl.figure.Figure.text() 在Figure对象的任意位置添加文字
suptitle() mpl.figure.Figure.suptitle() 为Figure对象添加中心化的标题

文本

  • 只需要记住:
  • title()
  • text()
  • xlabel()
  • ylabel()
  • font设置
    • font = {'fontsize': 20,
    • 'family': 'STKaiti',
    • 'color': 'red',
    • 'weight': 'bold'} # 字体加粗
import numpy as np
import matplotlib.pyplot as plt

# 字体属性
font = {'fontsize': 20,
        'family': 'STKaiti',
        'color':  'red',
        'weight': 'bold'} # 字体加粗

x = np.linspace(0.0, 5.0, 100)
y = np.cos(2*np.pi*x) * np.exp(-x)

plt.figure(figsize=(9,6))
plt.plot(x, y, 'g')

# 视图的标题,小标题
plt.title('指数级衰减',fontdict=font,pad = 20)

# figure的大标题,大标题
plt.suptitle('指数衰减',y = 1.05,fontdict = font,fontsize = 30)


plt.text(x = 2, y = 0.65, # 横纵坐标位置
         s = r'$\cos(2 \pi x) \exp(-x)$',fontdict=font) # 文本内容


plt.text(x = 2,y = -0.4,s = 'Hello World!')

plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.show()
png

箭头 - arrow

import matplotlib.pyplot as plt
import numpy

# 随机生成数字 10行2列(x,y)
loc = np.random.randint(0,10,size = (10,2))

plt.figure(figsize=(8, 8))

# 画图,所有行,都获取,索引0---->横坐标
# 所有行,都获取,索引1---->纵坐标
plt.plot(loc[:,0], loc[:,1], 'gh', ms=20)

plt.grid(True)

# 路径
way = np.arange(10) # 0、1、2…、9索引
print(way)

np.random.shuffle(way) # 洗牌,打乱顺序
print(way)

# 10个点,连9条线
for i in range(0, 9): # for循环遍历,少一个,最后一个特殊
    start = loc[way[i]] # 起点
    end = loc[way[i+1]] # 终点
    
    plt.arrow(x = start[0], y = start[1], # 箭头起点 
              dx = end[0]-start[0], dy = end[1]-start[1], # 坐标移动位置
              head_width=0.2, lw=2,#箭头长度,箭尾线宽
              length_includes_head = True) # 长度计算包含箭头箭尾
    
    plt.text(start[0],start[1],s = i,fontsize = 18,color = 'red') # 文本
    if i == len(way) - 2: # 最后一个点
        plt.text(end[0],end[1],s = i + 1,fontsize = 18,color = 'red')
        
        start = loc[way[-1]] # 最后一个点
        end = loc[way[0]] # 起点,对应着0点
        
        plt.arrow(x = start[0], y = start[1], # 箭头起点 
              dx = end[0]-start[0], dy = end[1]-start[1], # 坐标移动位置
              head_width=0.2, lw=2,#箭头长度,箭尾线宽
              length_includes_head = True,color = 'red') # 长度计算包含箭头箭尾
[0 1 2 3 4 5 6 7 8 9]
[4 3 0 7 9 2 6 1 8 5]
png

注释(箭头 + 文本)¶

  • annotate
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

x = np.arange(0.0, 5.0, 0.01)
y = np.cos(2*np.pi*x)

line, = ax.plot(x,y,lw=2)

plt.rcParams['font.family'] = 'STKaiti'
plt.rcParams['font.size'] = 20

# 注释
ax.annotate('最大值', # 文本内容
            xy=(2, 1),  # 箭头指向位置
            xytext=(3, 1.5), # 文本位置
            arrowprops=dict(facecolor='black', shrink=0.05)) # 箭头模样


ax.annotate('最小值',
            xy = (2.5,-1),
            xytext = (4,-1.8),
            arrowprops = dict(facecolor = 'green',
                              width = 2, # 箭头宽度
                              headwidth = 10,# 箭头头部宽度
                              headlength = 10, # 箭头头部长度
                              shrink = 0.05)) # 箭头两端收缩的百分比(占总长)
ax.annotate('median',
            xy = (2.25,0),
            xytext = (0.5,-1.8),
            arrowprops = dict(arrowstyle = '-|>'), # 箭头样式
            fontsize = 20)

ax.set_ylim(-2, 2) # y轴范围调宽
png

注释箭头连接形状

import matplotlib.pyplot as plt

def annotate_con_style(ax, connectionstyle):
    x1, y1 = 3,2
    x2, y2 = 8,6
    ax.plot([x1, x2], [y1, y2], ".")
#     TypeError: Axes.annotate() missing 1 required positional argument: 'text'
    ax.annotate('',
                xy=(x1, y1), # 相当于B点,arrow head
                xytext=(x2, y2), # 相当于A点,arrow tail
                arrowprops=dict(arrowstyle='->', color='red',
                                shrinkA = 5,shrinkB = 5,
                                connectionstyle=connectionstyle))

    ax.text(.05, 0.95, connectionstyle.replace(",", "\n"),
            transform=ax.transAxes, # 相对坐标
            ha="left", va="top")# 指定对齐方式

# 常用箭头连接样式
fig, axs = plt.subplots(3, 5, figsize=(15,9))
annotate_con_style(axs[0, 0], "angle3,angleA=90,angleB=0")
annotate_con_style(axs[1, 0], "angle3,angleA=0,angleB=90")
annotate_con_style(axs[2, 0], "angle3,angleA = 0,angleB=150")
annotate_con_style(axs[0, 1], "arc3,rad=0.")
annotate_con_style(axs[1, 1], "arc3,rad=0.3")
annotate_con_style(axs[2, 1], "arc3,rad=-0.3")
annotate_con_style(axs[0, 2], "angle,angleA=-90,angleB=180,rad=0")
annotate_con_style(axs[1, 2], "angle,angleA=-90,angleB=180,rad=5")
annotate_con_style(axs[2, 2], "angle,angleA=-90,angleB=10,rad=5")
annotate_con_style(axs[0, 3], "arc,angleA=-90,angleB=0,armA=30,armB=30,rad=0")
annotate_con_style(axs[1, 3], "arc,angleA=-90,angleB=0,armA=30,armB=30,rad=5")
annotate_con_style(axs[2, 3], "arc,angleA=-90,angleB=0,armA=0,armB=40,rad=0")
annotate_con_style(axs[0, 4], "bar,fraction=0.3")
annotate_con_style(axs[1, 4], "bar,fraction=-0.3")
annotate_con_style(axs[2, 4], "bar,angle=180,fraction=-0.2")

for ax in axs.flat:
    # 设置轴域刻度
    ax.set(xlim=(0, 10), ylim=(0, 10),xticks = [],yticks = [],aspect=1)
fig.tight_layout(pad=0.2)
png

​案例

from scipy.signal import find_peaks

# 定义 x 和 y
x = np.linspace(0.0, 5.0, 100)
y = np.cos(2*np.pi*x) * np.exp(-x)

# 寻找峰值和谷值
peaks, _ = find_peaks(y)
valleys, _ = find_peaks(-y)

# 绘制图形
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='y = cos(2πx) * exp(-x)')
plt.axhline(y=y_mean, color='r', linestyle='--', label=f'平均值: {y_mean:.2f}')

# 标记峰值和谷值
plt.scatter(x[peaks], y[peaks], color='blue', label='峰值')
plt.scatter(x[valleys], y[valleys], color='orange', label='谷值')

# 在峰值和谷值旁边用文字标注
for peak in peaks:
    plt.text(x[peak], y[peak], f'{y[peak]:.2f}', verticalalignment='bottom', horizontalalignment='right')

for valley in valleys:
    plt.text(x[valley], y[valley], f'{y[valley]:.2f}', verticalalignment='top', horizontalalignment='right')

plt.title('函数 y = cos(2πx) * exp(-x) 的图像(包含所有峰值和谷值)')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()

第六部分 常用视图

折线图 - plot

  • 适用于连续数据 变量之间随时间变化趋势
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randint(0,10,size = 15)

# 一图多线
plt.figure(figsize=(9,6))
plt.plot(x,marker = '*',color = 'r')
plt.plot(x.cumsum(),marker = 'o')
axes = plt.gca()

# 多图布局
fig,axs = plt.subplots(2,1)
fig.set_figwidth(9)
fig.set_figheight(6)
axs[0].plot(x,marker = '*',color = 'red')
axs[1].plot(x.cumsum(),marker = 'o')
png

png

第二节 柱状图 - bar

  • 适用于离散数据 统计和比较数据之间的差别 统计/对比

堆叠柱状图

import numpy as np
import matplotlib.pyplot as plt
labels = ['G1', 'G2', 'G3', 'G4', 'G5','G6'] # 级别
men_means = np.random.randint(20,35,size = 6)
women_means = np.random.randint(20,35,size = 6)
men_std = np.random.randint(1,7,size = 6)
women_std = np.random.randint(1,7,size = 6)
width = 0.35

# men_means
plt.bar(labels, # 横坐标
        men_means, # 柱高
        width, # 线宽 - 堆叠
        yerr=4, # 误差条 - 堆叠 
        label='Men')#标签

# women_means
plt.bar(labels, women_means, width, yerr=2, bottom=men_means,
       label='Women')

plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.legend() # 图例
png

分组带标签柱状图

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

labels = ['G1', 'G2', 'G3', 'G4', 'G5','G6'] # 级别
men_means = np.random.randint(20,35,size = 6)
women_means = np.random.randint(20,35,size = 6)
x = np.arange(len(men_means))
plt.figure(figsize=(9,6))

# 绘制图形
rects1 = plt.bar(x - width/2, men_means, width) # 返回绘图区域对象
rects2 = plt.bar(x + width/2, women_means, width)

# 设置标签标题,图例
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(x,labels)
plt.legend(['Men','Women'])

# 添加注释
def set_label(rects):
    for rect in rects:
        height = rect.get_height() # 获取高度
        plt.text(x = rect.get_x() + rect.get_width()/2, # 水平坐标
                 y = height + 0.5, # 竖直坐标
                 s = height, # 文本
                 ha = 'center') # 水平居中

set_label(rects1)
set_label(rects2)
plt.tight_layout() # 设置紧凑布局
png

第三节 直方图 - hist

  • 适用于连续数据 展示一组或者多组数据的分布 分布状况
import numpy as np
import matplotlib.pyplot as plt

mu = 100 # 平均值
sigma = 15 # 标准差
x = np.random.normal(loc = mu,scale = 15,size = 10000)
fig, ax = plt.subplots()

n, bins, patches = ax.hist(x, 200, density=True) # 直方图

# 概率密度函数
y = ((1 / (np.sqrt(2 * np.pi) * sigma)) *
     np.exp(-0.5 * (1 / sigma * (bins - mu))**2))
plt.plot(bins, y, '--')
plt.xlabel('Smarts')
plt.ylabel('Probability density')
plt.title(r'Histogram of IQ: $\mu=100$, $\sigma=15$')

# 紧凑布局
fig.tight_layout()
png

第四节 散点图 - scatter

  • 适用于离散数据 变量之间是否存在数量关联趋势 关系/规律
  • 散点图的英文叫做 scatter plot,它将两个变量的值显示在二维坐标中,非常适合展示两个变量之间的关系
import numpy as np
import matplotlib.pyplot as plt
data = np.random.randn(100,2)
s = np.random.randint(100,300,size = 100)
color = np.random.randn(100)
plt.scatter(data[:,0], # 横坐标
            data[:,1], # 纵坐标
            s = s, # 尺寸
            c = color, # 颜色
            alpha = 0.5) # 透明度
png

第五节 - 饼图 - pie

  • 适用于分类数据 展示不同分类的占比情况 占比

一般饼图

import numpy as np
import matplotlib.pyplot as plt
# 解决中文字体乱码的问题
plt.rcParams['font.sans-serif']='STKaiti' 

labels =["五星","四星","三星","二星","一星"] # 标签
percent = [95,261,105,30,9] # 某市星级酒店数量

# 设置图片大小和分辨率
fig=plt.figure(figsize=(5,5), dpi=120)

# 偏移中心量,突出某一部分
# 0.1 表示 10%,自身高度的10%,相对值
explode = (0, 0, 0, 0.1, 0) 
# 绘制饼图:autopct显示百分比,这里保留一位小数;shadow控制是否显示阴影

_ = plt.pie(x = percent,labels=labels,autopct='%0.1f%%',
            explode = explode,shadow=True) # 数据 # 阴影,3D效果
png

嵌套饼图

import pandas as pd
import matplotlib.pyplot as plt
food = pd.read_excel('data/food.xlsx')
# 分组聚合,内圈数据
inner = food.groupby(by = 'type')['花费'].sum()
outer = food['花费'] # 外圈数据
plt.rcParams['font.family'] = 'Kaiti'
plt.rcParams['font.size'] = 18
fig=plt.figure(figsize=(8,8))
# 绘制内部饼图
_ = plt.pie(x = inner, # 数据
        radius=0.6, # 饼图半径
        wedgeprops=dict(linewidth=3,width=0.6,edgecolor='w'),# 饼图格式:间隔线宽、饼图宽度、边界颜色
        labels = inner.index, # 显示标签
        labeldistance=0.4) # 标签位置
# 绘制外部饼图
_ = plt.pie(x = outer, 
        radius=1, # 半径
        wedgeprops=dict(linewidth=3,width=0.3,edgecolor='k'),# 饼图格式:间隔线宽、饼图宽度、边界颜色
        labels = food['食材'], # 显示标签
        labeldistance=1.2) # 标签位置

# 设置图例标题,bbox_to_anchor = (x, y, width, height)控制图例显示位置
_ = plt.legend(inner.index,bbox_to_anchor = (0.9,0.6,0.4,0.4),title = '食物占比')
plt.tight_layout()
png

甜甜圈

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(6,6))
# 甜甜圈原料
recipe = ["225g flour",
          "90g sugar",
          "1 egg",
          "60g butter",
          "100ml milk",
          "1/2package of yeast"]
# 原料比例
data = [225, 90, 50, 60, 100, 5]
wedges, texts = plt.pie(data,startangle=40,  wedgeprops=dict(linewidth=0,width=0.6,edgecolor='w'),labeldistance=0.4)
bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(arrowprops=dict(arrowstyle="-"),
          bbox=bbox_props,va="center")

for i, p in enumerate(wedges):
    ang = (p.theta2 - p.theta1)/2. + p.theta1 # 角度计算
    # 角度转弧度----->弧度转坐标
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    ha = {-1: "right", 1: "left"}[int(np.sign(x))] # 水平对齐方式
    connectionstyle = "angle,angleA=0,angleB={}".format(ang) # 箭头连接样式
    kw["arrowprops"].update({"connectionstyle": connectionstyle}) # 更新箭头连接方式
    plt.annotate(recipe[i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
                 ha=ha,**kw,fontsize = 18,weight = 'bold')
plt.title("Matplotlib bakery: A donut",fontsize = 18,pad = 25)
plt.tight_layout()
png

第六节 面积图 - stackplot

import matplotlib.pyplot as plt
plt.figure(figsize=(9,6))
days = [1,2,3,4,5]  
sleeping =[7,8,6,11,7]
eating = [2,3,4,3,2]
working =[7,8,7,2,2]
playing = [8,5,7,8,13]   
plt.stackplot(days,sleeping,eating,working,playing)  
plt.xlabel('x')
plt.ylabel('y')
plt.title('Stack Plot',fontsize = 18)
plt.legend(['Sleeping','Eating','Working','Playing'],fontsize = 18)
png

第七节 极坐标图 - plot

import numpy as np
import matplotlib.pyplot as plt

r = np.arange(0, 4*np.pi, 0.01) # 弧度值
y = np.linspace(0,2,len(r)) # 目标值

ax = plt.subplot(111,projection = 'polar',facecolor = 'lightgreen') # 定义极坐标
_ = ax.plot(r, y,color = 'red')
ax.set_rmax(3) # 设置半径最大值
ax.set_rticks([0.5, 1, 1.5, 2])  # 设置半径刻度
ax.set_rlabel_position(-22.5)  # 设置半径刻度位置
ax.grid(True) # 网格线
ax.set_title("A line plot on a polar axis", va='center',ha = 'center',pad = 30)
png

第八节 箱型图 - boxplot

import numpy as np
import matplotlib.pyplot as plt
data=np.random.normal(size=(500,4)) # 正态分布

lables = ['A','B','C','D']
# 用Matplotlib画箱线图

# 黄色线,中位数
# 查看数据分布情况,看异常值
_ = plt.boxplot(data,1,'ro',labels=lables) # 红色的圆点是异常值
png

第九节 热力图

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

# 标签
vegetables = ["cucumber", "tomato", "lettuce", "asparagus","potato", "wheat", "barley"]
farmers = list('ABCDEFG')

# 创造数据,随机数
harvest = np.random.randn(7,7)*5 # 农民丰收数据

plt.rcParams['font.size'] = 18
plt.rcParams['font.weight'] = 'heavy'

plt.figure(figsize=(6,6))

# imshow,显示图片
im = plt.imshow(harvest,cmap = 'PuBu')# 因为数值,各不相同

# 绘制文本
for i in range(len(vegetables)):
    for j in range(len(farmers)):
        text = plt.text(j, i, round(harvest[i, j],1),
                       ha="center", va="center", color='r')
png

第十节 雷达图 - 蜘蛛图 - 六维能力图

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'STKaiti'
labels=np.array(["个人能力","IQ","服务意识","团队精神","解决问题能力","持续学习"])
y=[83, 61, 95, 67, 76, 88]

# 画图数据准备,角度、状态值
x = np.linspace(0, 2*np.pi, len(labels), endpoint=False)

y = np.concatenate([y,[y[0]]]) # 首尾相接
x = np.concatenate([x,[x[0]]]) # 增加
print(y)

# 用Matplotlib画蜘蛛图
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, polar=True)   

# o表示形状,圆形
# -实线
# o-属性连用
ax.plot(x, y, 'r*--', linewidth=2,markersize = 30) # 连线
ax.fill(x,y,alpha = 0.2)

# x = 3.14 ---> 180
# 标签显示,去掉一个
_ = ax.set_thetagrids(x[:-1] * 180/np.pi,
                  labels,
                  fontsize = 18)
png

第七部分 3D图形

第一节 三维折线图散点图

import numpy as np
import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d.axes3d import Axes3D

x = np.linspace(0,60,300)
y = np.sin(x)
z = np.cos(x)

# fig = plt.figure(figsize=(9,6))
# a3 = Axes3D(fig) # 二维变成3D
# a3.plot(x,y,z)
plt.figure(figsize=(9,6))
a3 = plt.subplot(111,projection = '3d')
a3.plot(x,y,z) # 普通线形图
a3.set_xlabel('X')
a3.set_ylabel('Y')
a3.set_zlabel('Z')

# 散点图
x = np.random.randint(0,60,size = 20)
y = np.random.randn(20)
z = np.random.randn(20)
a3.scatter(x,y,z,color= 'red')
# 调整视图的角度
a3.view_init(elev = 20,azim=-30)
png

第二节 三维柱状图

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D # 3D引擎
month = np.arange(1,5)
# 每个月 4周 每周都会产生数据
# 三个维度:月、周、销量
fig = plt.figure(figsize=(9,6))
ax3 = Axes3D(fig)

for m in month:
    ax3.bar(np.arange(4),
            np.random.randint(1,10,size = 4),
            zs = m ,
            zdir = 'x',# 在哪个方向上,一排排排列
            alpha = 0.7,# alpha 透明度
            width = 0.5)
ax3.set_xlabel('X',fontsize = 18,color = 'red')
ax3.set_ylabel('Y',fontsize = 18,color = 'red')
ax3.set_zlabel('Z',fontsize = 18,color = 'green')
plt.show()

seaborn快速入手

seanborn 线性图 - lineplot

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

sns.set(style = 'ticks',context = 'paper',font = 'STKaiti') # 设置样式

plt.figure(figsize=(9,6))


x = np.linspace(0,2*np.pi,20)
y = np.sin(x)

# lineplot方法,画一条线
sns.lineplot(x = x,y = y,color = 'green',ls = '--')
sns.lineplot(x = x,y = np.cos(x),color = 'red',ls = '-.')
png

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
sns.set(style = 'dark',context = 'notebook',font = 'STKaiti') # 设置样式
plt.figure(figsize=(9,6))

# 加载数据
fmri = pd.read_csv('data/fmri.csv') # fmri这一核磁共振数据

ax = sns.lineplot(x = 'timepoint',y = 'signal',
                  hue = 'event',# 根据event属性分类,绘制
                  style = 'event' ,# 根据event属性分类,指定样式
                  data= fmri,
                  palette='ocean', # 画板,颜色
                  markers=True,
                  markersize = 10)

plt.xlabel('时间节点',fontsize = 30)
png

条形图 - barplot

import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize = (9,6))
sns.set(style = 'whitegrid')
tips = pd.read_csv('data/tips.csv') # 小费

ax = sns.barplot(x = "total_bill", y = "day", 
                 data = tips,
                 palette = 'colorblind',orient='h')
png

热力图(重要)

  • 它这个热力图最重要的点,可以快速查看各个字段的相关性
  • 帮助我们在数据处理阶段,获取比较符合目标值的列属性名
  • 用来做条件使用机器学习模拟数据
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(12,9))
flights = pd.read_csv('data/flights.csv') # 飞行数据
# !!! pivot数据重塑,改变DataFrame形状
flights = flights.pivot("month", "year", "passengers") # 年,月份,飞机乘客数量

sns.heatmap(flights, annot=True,fmt = 'd',cmap = 'RdBu_r',linewidths=5)
png

第九部分 数据分析师招聘数据分析

十六进制颜色码

第一节 各城市对数据分析岗位的需求量

两种常用颜色:浅蓝色: #3c7f99 ,淡黄色:#c5b783

# plt.figure(figsize=(12,9))
# cities = job['city'].value_counts() # 统计城市工作数量
# plt.barh(y = cities.index[::-1],
#         width = cities.values[::-1],
#         color = '#3c7f99')
# plt.box(False) # 不显示边框
# plt.title(label='           各城市数据分析岗位的需求量           ', 
#           fontsize=32, weight='bold', color='white', 
#           backgroundcolor='#c5b783',pad = 30 )
# plt.tick_params(labelsize = 16)
# plt.grid(axis = 'x',linewidth = 0.5,color = '#3c7f99')

第二节 不同领域对数据分析岗的需求量

# # 获取需求量前10多的领域
# industry_index = job["industryField"].value_counts()[:10].index
# industry =job.loc[job["industryField"].isin(industry_index),"industryField"]
# plt.figure(figsize=(12,9))
# plt.barh(y = industry_index[::-1],
#          width=pd.Series.value_counts(industry.values).values[::-1],
#          color = '#3c7f99')
# plt.title(label='      细分领域数据分析岗位的需求量(取前十)     ', 
#           fontsize=32, weight='bold', color='white', 
#           backgroundcolor='#c5b783',ha = 'center',pad = 30)
# plt.tick_params(labelsize=16)
# plt.grid(lw = 0.5,color = '#3c7f99',ls = '--')

第三节 各城市薪资状况

第四节 工作经验与薪水关系

第五节 学历要求

# education = job["education"].value_counts(normalize=True)
# plt.figure(figsize=(9,9))
# _ = plt.pie(education,labels=education.index,autopct='%0.2f%%',
#             wedgeprops=dict(linewidth=3,width = 0.5),pctdistance=0.8,
#             textprops = dict(fontsize = 20))
# _ = plt.title(label='             学历要求            ', 
#           fontsize=32, weight='bold', 
#           color='white', backgroundcolor='#c5b783')
# plt.savefig('./学历要求.png')

第六节 技能要求

第七节 大公司对技能要求

  • colors = ['#ff0000', '#ffa500', '#c5b783', '#3c7f99', '#0000cd']

第八节 不同规模的公司在招人要求上的差异

# from matplotlib import gridspec
# workYear_map = {
#     "5-10年": 5,
#     "3-5年": 4,
#     "1-3年": 3,
#     "1年以下": 2,
#     "应届毕业生": 1}
# color_map = {
#     5:"#ff0000",
#     4:"#ffa500",
#     3:"#c5b783",
#     2:"#3c7f99",
#     1:"#0000cd"}
# cond = job.workYear.isin(workYear_map)
# job = job[cond]
# job['workYear'] = job.workYear.map(workYear_map)
# # 根据companySize进行排序,人数从多到少
# job['companySize'] = job['companySize'].astype('category')
# list_custom = ['2000人以上', '500-2000人','150-500人','50-150人','15-50人','少于15人']
# job['companySize'].cat.reorder_categories(list_custom, inplace=True)
# job.sort_values(by = 'companySize',inplace = True,ascending = False)

# plt.figure(figsize=(12,11))
# gs = gridspec.GridSpec(10,1)
# plt.subplot(gs[:8])
# plt.suptitle(t='            不同规模公司的用人需求差异          ', 
#          fontsize=32, 
#          weight='bold', color='white', backgroundcolor='#3c7f99')
# plt.scatter(job.salary,job.companySize,
#             c = job.workYear.map(color_map),
#             s = (job.workYear*100),alpha = 0.35)
# plt.scatter(job.salary,job.companySize,
#             c = job.workYear.map(color_map))
# plt.grid(axis = 'x')
# plt.xticks(np.arange(0,161,10), [str(i)+"k" for i in range(0,161,10)])
# plt.xlabel('工资', fontsize=18)
# plt.box(False)
# plt.tick_params(labelsize = 18)

# # 绘制底部标记
# plt.subplot(gs[9:])
# x = np.arange(5)[::-1]
# y = np.zeros(len(x))
# s = x*100
# plt.scatter(x,y,s=s,c=color_map.values(),alpha=0.3)
# plt.scatter(x,y,c=color_map.values())
# plt.box(False)
# plt.xticks(ticks=x,labels=list(workYear_map.keys()),fontsize=14)
# plt.yticks(np.arange(1),labels=['  经验:'],fontsize=18)
# plt.savefig('./不同规模公司招聘薪资工作经验差异.png')
posted @ 2023-07-02 20:04  派森的猫  阅读(44)  评论(0编辑  收藏  举报