工欲善其事必先利其器之Matplotlib

Python开发工具集之可视化包Matplotlib

  • matplotlib是常用的Python的2D绘图包,可以对Python中的数据进行快速可视化,并以多种格式输出
  • 在matplotlib面向对象的绘图库中,pyplot是一个很好的API
  • pyplot与pylab的功能基本相同,pyplab包含许多NumPy和pyplot模块中常用的函数,十分适合在IPython交互式环境中使用
  • Pylab combines pyplot with numpy into a single namespace. This is convenient for interactive work, but for programming it is recommended that the namespaces be kept separate.

配置依赖环境

导入依赖模块

In [61]:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

导入中文依赖模块

In [62]:
from matplotlib.font_manager import *

# 解决中文显示问题
# 使用场景:在text()、label()、title()中添加:fontproperties=myfont1
myfont1 = FontProperties(
    fname='/usr/share/fonts/truetype/arphic/ukai.ttc'
)
# 第二种解决图例中文显示问题,配置:plt.legend(prop=myfont2)
myfont2 = matplotlib.font_manager.FontProperties(
      fname='/home/jw/etl/venv/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/simhei.ttf'
    , size = 14
)
# 解决不显示负号的问题
matplotlib.rcParams['axes.unicode_minus'] = False
# 解决 cannot find sans-serif family 问题
matplotlib.rcParams.update({    
    'font.family':'sans-serif',
    'font.sans-serif':['Liberation Sans'],
    })

# 有时配置后需要清除一下缓存才能正确显示
# rm -rf ~/.matplotlib/*.cache

plot 基础制图

  • matplotlib plot提供了很多 API 函数. 本节从 plot 基础制图开始
In [63]:
# 先上一副最基本的图表
# 如果仅向plot()命令提供单个列表或数组
# 则matplotlib假定它是一个y值序列
# 并自动生成x值
plt.plot([1, 2, 3, 4])
# 显示图表
plt.show()

添加 x, y 值

In [64]:
plt.plot(
      [1, 2, 3, 4]    # x 值(list)
    , [1, 4, 16, 64]  # x 值(list)
)
plt.show()

配置图形颜色和形状

颜色字符 说明 颜色字符 说明 颜色字符 说明
‘b’ 蓝色 ‘m’ 洋红色 magenta ‘0.8’ 灰度值字符串
‘g’ 绿色 ‘y’ 黄色 ‘#008000’ RGB某颜色
‘r’ 红色 ‘k’ 黑色 ‘w’ 白色
‘c’ 青绿色 cyan
标记字符 说明 标记字符 说明 标记字符 说明
‘-‘ 实线 ’s’ 实心方形标记 ‘^’ 上三角标记
‘–’ 破折线 ‘p’ 实心五角标记 ‘>’ 右三角标记
‘-.’ 点划线 '*' 星形标记 ‘<’ 左三角标记
‘:’ 虚线 '竖线' 垂直线标记 ‘h’ 竖六边形标记
‘.’ 点标记 ‘1’ 下花三角标记 ‘H’ 横六边形标记
‘,’ 像素标记(极小点) ‘2’ 上花三角标记 ‘+’ 十字标记
‘o’ 实心圈标记 ‘3’ 左花三角标记 ‘x’ x标记
‘v’ 倒三角标记 ‘4’ 右花三角标记 ‘d’ 瘦菱形标记
‘D’ 菱形标记
In [121]:
plt.plot(
      [1, 2, 3, 4]      # x 值(list)
    , [1, 4, 16, 64]    # x 值(list)
    , 'r:'              # r 表示红色,: 表示虚线
)
plt.show()

添加关键字 plt.plot(x, y, format_string, **kwargs)

In [122]:
plt.plot(
      [1, 2, 3, 4]           # x 值(list)
    , [1, 4, 16, 64]         # x 值(list)
    , 'r:'                   # r 表示红色,: 表示虚线. 是关键字中color和linestyle的简化写法. 相同配置中生效的写法是后面的代码
    , color = 'm'            # 线条颜色.与前述 r 功能相同
    , linestyle = 'dashdot'  # 线条类型,与前述 : 功能相同,选择项包括: [‘solid’ | ‘dashed’, ‘dashdot’, ‘dotted’ | (offset, on-off-dash-seq) | '-' | '--' | '-.' | ':' | 'None' | ' ' | '']
    , linewidth = 5.0        # 线条宽度
    , marker ='o'            # 标记点形状
    , markersize = '10'      # 标记点大小
    , markerfacecolor ='k'   # 标记点颜色
)
plt.show()

配置两个线条

In [123]:
def funy1(x):
    return x*0.75+5
def funy2(x):
    return x**2*0.3+x*0.75+0.1
x = np.linspace(-5,5,10)
y1=funy1(x)
y2=funy2(x)
plt.plot(
      x, y1, 'r-'
    , x, y2, 'g--'
)
plt.show()

配置两个线条的第二种方法

In [68]:
def funy1(x):
    return x*0.75+5
def funy2(x):
    return x**2*0.3+x*0.75+0.1
x = np.linspace(-5,5,10)
y1=funy1(x)
y2=funy2(x)
plt.plot(x, y1, 'r-')
plt.plot(x, y2, 'g--')
plt.show()

控制线条属性-使用set方法

In [69]:
def funy1(x):
    return x*0.75+5
def funy2(x):
    return x**2*0.3+x*0.75+0.1
x = np.linspace(-5,5,10)
y1=funy1(x)
y2=funy2(x)
plt.plot(x, y1, 'r-')
line, = plt.plot(x, y2, 'g--', lw = 5)
line.set_antialiased(False)  # antialised代表字体抗锯齿,False为关闭
plt.show()

控制线条属性-使用setp()命令

In [70]:
def funy1(x):
    return x*0.75+5
def funy2(x):
    return x**2*0.3+x*0.75+0.1
x = np.linspace(-5,5,10)
y1=funy1(x)
y2=funy2(x)
plt.plot(x, y1, 'r-')
line, = plt.plot(x, y2, 'g--')
plt.setp(line, color='b', linewidth=1)
plt.show()

添加标题 title

In [71]:
def funy1(x):
    return x*0.75+5
def funy2(x):
    return x**2*0.3+x*0.75+0.1
x = np.linspace(-5,5,10)
y1=funy1(x)
y2=funy2(x)
plt.plot(x, y1, 'r-')
plt.plot(x, y2, 'g--')
plt.title('www.jasper.wang\n土豪哥我们做朋友吧', fontproperties=myfont1, fontsize=18) # 植入硬广告
plt.show()

添加 x,y 轴的标签 plt.xlabel(), plt.ylabel()

In [72]:
def funy1(x):
    return x*0.75+5
def funy2(x):
    return x**2*0.3+x*0.75+0.1
x = np.linspace(-5,5,10)
y1=funy1(x)
y2=funy2(x)
plt.plot(x, y1, 'r-')
plt.plot(x, y2, 'g--')
plt.title('www.jasper.wang\n土豪哥我们做朋友吧', fontproperties=myfont1, fontsize=18) # 植入硬广告
# 如有中文,配置字体为之前设定的 myfont
# fontsize=14 配置字体大小
plt.ylabel('y 轴标签', fontproperties=myfont1, fontsize=14) 
plt.xlabel('x 轴标签', fontproperties=myfont1, fontsize=14)
plt.show()

配置图例 plt.legend()

loc 数值代表的位置
'best' 0 (自适应方式)
'upper right' 1
'upper left' 2
'lower left' 3
'lower right' 4
'right' 5
'center left' 6
'center right' 7
'lower center' 8
'upper center' 9
'center' 10
In [73]:
def funy1(x):
    return x*0.75+5
def funy2(x):
    return x**2*0.3+x*0.75+0.1
x = np.linspace(-5,5,10)
y1=funy1(x)
y2=funy2(x)
l1, = plt.plot(x, y1, 'r-', label="www.jasper.wang")
l2, = plt.plot(x, y2, 'g--', label="土豪哥我们做朋友吧")
plt.title('www.jasper.wang\n土豪哥我们做朋友吧', fontproperties=myfont1, fontsize=18) # 植入硬广告
# 如有中文,配置字体为之前设定的 myfont1
# fontsize=14 配置字体大小
plt.ylabel('y 轴标签', fontproperties=myfont1, fontsize=14) 
plt.xlabel('x 轴标签', fontproperties=myfont1, fontsize=14)
# 如前导入中文依赖模块,此处引用 prop=myfont2
# frameon=True 为配置图例是否使用外框
# 图例的 loc 配置项见下表列出
# 如果此处使用porp, 则字体大小只能由myfont2中配置的size=14起作用
# 如果此处没有使用porp, 则字体大小由fontsize=xxx生效, 但这样无法显示中文
plt.legend(handles=[l1, l2], loc = 0, frameon=False, prop=myfont2)
# plt.legend(handles=[l1, l2], loc = 0, frameon=False, fontsize=14) 

plt.show()

添加文本 text()

  • text()命令可用于在任意位置添加文本
  • xlabel(), ylabel() 和 title() 用于在指定的位置添加文本
In [74]:
def funy1(x):
    return x*0.75+5
def funy2(x):
    return x**2*0.3+x*0.75+0.1
x = np.linspace(-5,5,10)
y1=funy1(x)
y2=funy2(x)
l1, = plt.plot(x, y1, 'r-', label="www.jasper.wang")
l2, = plt.plot(x, y2, 'g--', label="土豪哥我们做朋友吧")
plt.title('www.jasper.wang\n土豪哥我们做朋友吧', fontproperties=myfont1, fontsize=18) # 植入硬广告
plt.ylabel('y 轴标签', fontproperties=myfont1, fontsize=14) 
plt.xlabel('x 轴标签', fontproperties=myfont1, fontsize=14)
plt.legend(handles=[l1, l2], loc = 0, frameon=False, prop=myfont2)
# 前两个参数是text的x和y的位置
plt.text(-2.7, 2.5, ' www.jasper.wang\n土豪哥我们做朋友吧', fontproperties=myfont1, fontsize=14, color='b') # 植入硬广告
plt.show()