数据分析第二篇:matplotlib 常用的几个绘图方法

Matplotlib

matplotlib是python的绘图库,使用它可以很方便的绘制出版质量级别的图形

matplotlib的基本功能

1.基本绘图

1.1 绘制坐标系中连续的线,设置线型/线宽/颜色

绘制一条线的相关API

import numpy as np
import matplotlib.pyplot as plt
# xarray:散点的x坐标数组
# yarray:散点的y坐标数组
plt.plot(xarray, yarray)
plt.show()

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1,10)
y = np.arange(1,10)
plt.plot(x, y)
plt.show()

绘制水平线和垂直线相关API

# 绘制一条垂直x轴的线,需要给定x坐标值的value,指定y坐标范围
plt.vlines(value, ymin, ymax,..)
# 绘制一条垂直y轴的线,需要给定y坐标值的value,指定x坐标范围
plt.hlines(value, xmin, xmax,..)

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1,10)
y = np.arange(1,10)
plt.plot(x, y)
plt.vlines(5, 3, 8)
plt.hlines(5, 3, 8)
plt.show()

 

线型/线宽/颜色

plt.plot(x,y,
        linestyle='',  # 线型
        linewidth=1,   # 线宽
        color='',   # 颜色
        alpha=0.5   # 透明度
        )
  • r 红色
  • g 绿色
  • b 蓝色
  • c cyan
  • m 紫色
  • y 土黄色
  • k 黑色
  • w 白色

1.2 设置坐标轴的范围

plt.xlim(x_lim_min, x_lim_max)
plt.ylim(y_lim_min, y_lim_max)

1.3 设置坐标刻度

# 设置x轴的坐标刻度
# x_val_list:坐标值列表
# x_text_list:坐标刻度列表
plt.xticks(x_val_list, x_text_list)
plt.yticks(y_val_list, y_text_list)

# 设置坐标刻度[-π,-π/2, 0, π/2, π]
---------------方法一------------
x_val_list= [-np.pi, -np.pi/2, 0, np.pi/2, np.pi]
x_text_list = ['','-π/2','0','π/2','π']
plt.xticks(x_val_list, x_text_list)

--------------方法二-------------
x_text_list = [r'$-pi$',r'$-frac{pi}{2}$',r'0',r'$frac{pi}{2}$',r'${pi}$']

刻度文本的特殊语法 - LaTeX排版语法规范

设置坐标轴

坐标轴包含四个:left/right/bottom/top

# getCurrentAxis() 获取当前坐标轴对象
ax = plt.gca()
ax1 = ax.spines['left']
axr = ax.spines['right']

# 设置坐标轴的颜色
axl.set_color('none')  # 设置坐标轴颜色为透明
# 设置坐标轴的位置
axl.set_position((type,val))

# 设置坐标轴颜色与位置
ax = plt.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))

1.4 显示图例

# 自动在窗口中某个位置添加图例
# 添加图例需要在调用plt.plot()绘制曲线时设置label参数
通过loc参数设置图例的位置
plt.legend(loc='')

# 实例

plt.plot(x, cos_x, linestyle='--', linewidth=3, color='y', label=r'$y =frac{1}{2}cos(x)$')
plt.plot(x, sin_x, linestyle='-.', linewidth=1, color='m', label=r'$y=sin(x)$')
plt.legend()

1.5 绘制特殊点

plt.scatter(x,y,
           marker='',   # 点型
           s=3,       # 点的大小
           edgecolor='',  # 边缘色
           facecolor='',   # 填充色
           zorder=3)      # 绘制顺序

1.6 为图像添加备注

plt.annotate(
    '',             # 备注内容
    xycoords='',   # 备注目标点使用的坐标系
    xy=(x,y),      # 备注目标点的坐标
    textcoords= '',  # 备注文本使用的坐标系
    xytext = (x,y),   # 备注文本的坐标
    fontsize = 14,    # 备注文本字体大小
    arrowprops = dict()   # 提示箭头属性
)

arrowprops参数使用字典定义只想目标点的箭头样式

arrowprops = dict(
    arrowstyle = '',   # 定义箭头样式
    connectionstyle = '' # 定义连接线样式
)
# 可设置箭头的弧度
connectionstyle='arc3, rad=0.1',

2.高级绘图

2.1 绘制子图

一次绘制两个窗口

plt.figure(
'',       # 窗口标题
    figsize=(4,3),    # 窗口大小
    facecolor = ''    # 窗口颜色
)
plt.show()    # 展示窗口

# 可以创建多个窗口,每个窗口的标题不同,后续调用plt的方法进行绘制时将作用于当前窗口上
#,如果希望修改已经创建过的窗口,可以通过plt.figure(
'figure1')方法把该窗口设置为当前窗口。 plt.figure('figure1', figsize=(4,3), facecolor='lightgray') plt.figure('figure2', figsize=(4,3), facecolor='lightgray')

设置当前窗口的常用参数

plt.title('', fontsize=18) # 设置标题
plt.xlabel('', fontsize=12) # 设置窗口中x坐标轴的文本及y坐标轴的文本
plt.ylabel('', fontsize=12)
plt.tick_params(label=8) #
plt.grid() # 设置图表网格线
plt.tight_layout() # 设置紧凑布局

矩阵式布局


plt.figure('')
# 开始绘制一个子图
# 通过参数rows与cols拆分当前窗口,每个子窗口都将分配一个序号, 1-x
plt.subplot(rows, cols, num)
plt.subplot(2,3,2)
plt.subplot(233)
plt.show()


绘制九宫格子图


import numpy as np
import matplotlib.pyplot as mp


mp.figure('Sub Layout', facecolor='gray')
for i in range(1, 10):
mp.subplot(3, 3, i)
mp.text(0.5, 0.5, i, ha='center',
va='center', size=36, alpha=0.8)
mp.xticks([])
mp.yticks([])
mp.tight_layout()
mp.show()

网格式布局

import matplotlib.gridspec as mg
mp.figure('')
# 该方法将会返回子图的二维数组
gs = mg.GridSpec(3, 3)
# 通过subplot对子图进行合并
# gs[0, :2]->合并0行中的0/1列作为1个子图进行绘制
mp.subplot(gs[0, :2])
mp.show()


 

自由布局

plt.figure(
'',       # 窗口标题
    figsize=(4,3),    # 窗口大小
    facecolor = ''    # 窗口颜色
)
plt.show()    # 展示窗口

# 可以创建多个窗口,每个窗口的标题不同,后续调用plt的方法进行绘制时将作用于当前窗口上,如果希望修改已经创建过的窗口,可以通过plt.figure('figure1')方法把该窗口设置为当前窗口。
plt.figure('figure1', figsize=(4,3), facecolor='lightgray')
plt.figure('figure2', figsize=(4,3), facecolor='lightgray')

 

2.2散点图

plt.scatter(x,y,marker='', s=10,color='',edgecolor='',facecolor='',zorder=3)

随机生成一堆点身高期望在1.72 体重在60kg

import numpy as np
import matplotlib.pyplot as plt

n = 100
x= np.random.normal(172, 20, n)
y= np.random.normal(60, 10, n)

plt.figure('Persons', facecolor='lightgray')
plt.title('Persons')
plt.xlabel('height')
plt.ylabel('weight')
d = (x-172)**2 + (y-60)**2
# 颜色映射
plt.scatter(x, y, c=d, s=40)
plt.show()

2.6 图像填充

以某种颜色自动填充两条曲线的闭合区域。

plt.fill_between(
    x,     # x轴水平坐标
    sinx,   # sinx曲线的y坐标
    cosx,    # cosx曲线的y坐标
    sinx<cosx,   # 填充条件为TRUE时,填充
    color='',    # 颜色
    alpha=0.3    # 透明度
)

实例:sinx>cosx的部分进行填充

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 8*np.pi,1000)
sinx = np.sin(x)
cosx = np.cos(x/2)/2

plt.figure('Fill', facecolor='lightgray')
plt.title('Fill')
plt.xlabel('X')
plt.ylabel('Y')
plt.tick_params(labelsize=10)
plt.plot(x,sinx,color='y', label='y=sin(x)')
plt.plot(x, cosx,color='b', label='y=cos(x/2)/2')

plt.fill_between(
    x,     # x轴水平坐标
    sinx,   # sinx曲线的y坐标
    cosx,    # cosx曲线的y坐标
    sinx>cosx,   # 填充条件为TRUE时,填充
    color='dodgerblue',    # 颜色
    alpha=0.5    # 透明度
)
plt.tight_layout()
plt.legend()
plt.show()

2.7 条形图(柱状图)

plt.bar(
x,      # 水平坐标数组
    y,      # 柱状图高度数组
    width,    # 柱子的宽度
    color='',    # 填充颜色
    label='',    # 标签
    alpha=0.5
)

案例:绘制苹果12个月的销量,绘制橘子的销量

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)

apples = [42, 35, 34, 56, 47, 45, 75, 23, 45, 23, 42, 34]
oranges = [21, 43, 25, 46, 58, 74, 52, 12, 43, 54, 65, 46]

plt.figure('Bar', facecolor='lightgray')
plt.title('Bar', fontsize=18)
plt.xlabel('month', fontsize=14)
plt.ylabel('Price', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':', axis='y')

x = np.arange(len(apples))
plt.bar(x - 0.2, apples, 0.4, color='y', label='Apple')
plt.bar(x + 0.2, oranges, 0.4, color='b', label='Orange')

plt.xticks(x, ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月',
               '十月', '十一月', '十二月'])
plt.legend()
plt.show()

 

2.8 饼图

功能:统计出占所有总量的百分比

plt.pie(
values,    # 值列表
    spaces,    # 扇形之间的间距列表
    labels,     # 扇形的标签列表
    colors,     # 扇形的颜色列表
    '%d%%',     # 所占比例的格式
    shadow=True, # 绘制阴影
    startangle=90,  # 逆时针绘制饼状图的起始角度
    radius=1     # 半径
 )

案例:绘制饼状图显示5门语言的流行度

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)

plt.figure('Pie', facecolor='lightgray')
plt.title('Pie', fontsize=18)

values = [23, 24, 46, 57, 87]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01]
labels = ['Python', 'Javascript', 'C++', 'Java', 'PHP']
colors = ['r', 'g', 'b', 'y', 'c']
plt.pie(values, spaces, labels, colors,'%d%%', shadow=False)

plt.legend()
plt.show()

 

2.9 等高线图

组成等高线需要网格点坐标矩阵,也需要每个点的高度,所以等高线的绘制属于3D数学模型的范畴

mp.contourf(
    x,    # 网格坐标矩阵
    y,
    z,    # 坐标矩阵中每个点的值
    8,    # 把整个模型的高度等分为8份
    cmap='jet'   # 颜色映射
)
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False  #解决坐标轴负号的显示问题
n = 1000
x, y = np.meshgrid(np.linspace(-3,3,n),
                   np.linspace(-3,3,n))
z = (1-x/2+x**5+y**3)*np.exp(-x**2 - y**2)
plt.figure('Contour', facecolor='lightgray')
plt.title('Contour', fontsize=18)
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.contourf(x,y,z,8,cmap='jet')
cntr = plt.contour(x,y,z,8,colors='black', linewidths=0.5)

# 设置等高线的标签文本
plt.clabel(cntr, inline_spacing=1, fmt='%.1f', fontsize=10)

plt.legend()
plt.show()

 

2.10 热成像图

用图像的方式显示矩阵集矩阵中值的大小

# origin的可选值:
# 'upper':默认值 y轴方向向下,原点在上方
# 'lower':原点在下方
plt.imshow(z, cmap='jet',origin='lower')

实例:热成像图

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False  #解决坐标轴负号的显示问题
n = 1000
x, y = np.meshgrid(np.linspace(-3,3,n),
                   np.linspace(-3,3,n))
z = (1-x/2+x**5+y**3)*np.exp(-x**2 - y**2)
plt.figure('Hot', facecolor='lightgray')
plt.title('Hot', fontsize=18)
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.imshow(z, cmap='jet', origin='lower')
plt.show()

 

2.11 3D图像绘制

matplotlib支持绘制三维曲面,但需要使用axis3d提供的3D坐标轴进行绘制。

from mpl_toolkits.mplot3d import axes3d
ax3d = plt.gca(projection='3d')
# 使用ax3d对象绘制3维图形
ax3d.scatter()         # 3维散点图
ax3d.plot_surface()    # 3维平面图
ax3d.plot_wireframe()  # 3维线框图

三维散点图的绘制

ax3d.scatter(
x,y,z,   # 点的位置坐标点
    marker,
    s=30,
    zorder=3,
    color='',
    edgecolor='',
    facecolor='',
    c=v,
    cmap=''
)

案例:生成三维散点数组,显示在三维坐标中。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负号的显示问题
n = 1000
# 期望是0, 标准差是1
x = np.random.normal(0, 1, n)
y = np.random.normal(0, 1, n)
z = np.random.normal(0, 1, n)

plt.figure('Scatter', facecolor='lightgray')
plt.title('Scatter', fontsize=18)
plt.grid(linestyle=':')

ax = plt.gca(projection='3d')
ax.set_xlabel('X', fontsize=12)
ax.set_ylabel('Y', fontsize=12)
ax.set_zlabel('Z', fontsize=12)
plt.tick_params(labelsize=8)

# v的值用于设置散点的颜色
v = np.sqrt(x ** 2 + y ** 2 + z ** 2)
ax.scatter(x, y, z, c=v, cmap='jet')

plt.show()

 

三维平面图的绘制

ax3d.plot_surface(
x,y,z,    # 点的位置坐标点
    rstride = 30,  # 行跨距
    cstride=30,   # 列跨距
    cmap='jet'   # 颜色映射
)
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负号的显示问题
n = 1000
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

plt.figure('三维平面图', facecolor='lightgray')
plt.title('三维平面图', fontsize=18)
plt.grid(linestyle=':')

ax = plt.gca(projection='3d')
ax.set_xlabel('X', fontsize=12)
ax.set_ylabel('Y', fontsize=12)
ax.set_zlabel('Z', fontsize=12)
plt.tick_params(labelsize=8)

# v的值用于设置散点的颜色
v = np.sqrt(x ** 2 + y ** 2 + z ** 2)
ax.plot_surface(x, y, z, rstride=30, cstride=30, cmap='jet')

plt.show()

三维线框图的绘制

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

plt.rcParams['font.sans-serif'] = ['SimHei']  # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负号的显示问题
n = 1000
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

plt.figure('三维平面图', facecolor='lightgray')
plt.title('三维平面图', fontsize=18)
plt.grid(linestyle=':')

ax = plt.gca(projection='3d')
ax.set_xlabel('X', fontsize=12)
ax.set_ylabel('Y', fontsize=12)
ax.set_zlabel('Z', fontsize=12)
plt.tick_params(labelsize=8)

# v的值用于设置散点的颜色
v = np.sqrt(x ** 2 + y ** 2 + z ** 2)
ax.plot_wireframe(x, y, z, rstride=30, cstride=30, cmap='jet')
plt.show()

 

原文地址:https://www.cnblogs.com/leijing0607/p/7681955.html