Matplotlib

1,Matplotlib - 介绍

 Matplotlib是一个强大的Python绘图和数据可视化的工具包。

# 安装方法
pip install matplotlib
# 引用方法
import matplotlib.pyplot as plt

# 绘图函数
plt.plot()
# 显示图像
plt.show()

这里可以使用jupyter,ipython notebook桌面解释器来运行matplotlib。

# 安装jupyter
!pip3 install jupyter

# 运行notebook
jupyter notebook

# 然后new一个python3文件,并且可以保存多种格式。

2,plot函数-绘制图像

plot函数:绘图函数。回值点图或线图,具体使用ipython: plt.plot?

# 这些属性可以不标示,直接写入引号里面即可。
#线型
linestyle(-,-.,--,...)
#点型
marker(v, ^, s, *, H, +, x, D, o,...)  # o代表圆实点,
#颜色
color(b, g, r, y, k, w, ...)

如图:

matplotlib 安装镜像 matplotlib清华镜像_图例

3,Matplotlib - 图像标注

Matplotlib - 图像标注

设置图像标题

plt.title()

设置y轴范围

plt.ylim()

设置x轴名称

plt.xlabel()

设置x轴刻度

plt.xticks()

设置y轴名称

plt.ylabel()

设置y轴刻度

plt.yticks()

设置x轴范围

plt.xlim()

设置曲线图例

plt.legend()

代码示例一:调整名字和间隔

import matplotlib.pyplot as plt
import numpy as np

# 图像一:
# 使用np.linspace定义x:范围是(-3,3);个数是50. 仿真一维数据组(x ,y1)表示曲线1. 仿真一维数据组(x ,y2)表示曲线2.
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2

# 使用plt.figure定义一个图像窗口. 使用plt.plot画(x ,y2)曲线. 
# 使用plt.plot画(x ,y1)曲线,曲线的颜色属性(color)为红色;曲线的宽度(linewidth)为1.0;曲线的类型(linestyle)为虚线.
# 使用plt.title定义标题,使用label定义线条名称,使用plt.legend()显示定义线条
plt.figure()
plt.plot(x, y2, label = 'Line A')
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--', label = 'Line B')
# legend将要显示的信息来自于上面代码中的 label. 所以我们只需要简单写下一下代码, plt 就能自动的为我们添加图例.
plt.legend(loc='lower right') 

# 使用plt.xlim设置x坐标轴范围:(-1, 2); 使用plt.ylim设置y坐标轴范围:(-2, 3); 
# 使用plt.xlabel设置x坐标轴名称:’I am x’;使用plt.ylabel设置y坐标轴名称:’I am y’;
plt.xlim((-1, 2)) 
plt.ylim((-2, 3)) 
plt.xlabel('I am x') 
plt.ylabel('I am y') 
plt.show() 

# 图像二:
# 使用np.linspace定义范围以及个数:范围是(-1,2);个数是5. 使用print打印出新定义的范围. 
# 使用plt.xticks设置x轴刻度:范围是(-1,2);个数是5.

new_ticks = np.linspace(-1, 2, 5)
plt.xticks(new_ticks)
plt.title('Temper')

# 使用plt.yticks设置y轴刻度以及名称:刻度为[-2, -1.8, -1, 1.22, 3];
# 对应刻度的名称为[‘really bad’,’bad’,’normal’,’good’, ‘really good’]. 使用plt.show显示图像.
plt.yticks([-2, -1.8, -1, 1.22, 3],[r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])
# plt.yticks(np.arange(0,10,2),['a','b','c','d','e','f'])
plt.show()

 

详解legend函数

plt.legend(loc='lower right')表示右下方

如果我们想单独修改之前的 label 信息, 给不同类型的线条设置图例信息. 我们可以在 plt.legend 输入更多参数. 如果以下面这种形式添加 legend, 我们需要确保, 在上面的代码 plt.plot(x, y2, label='linear line') 和 plt.plot(x, y1, label='square line') 中有用变量 l1 和 l2 分别存储起来. 而且需要注意的是 l1, l2,要以逗号结尾, 因为plt.plot() 返回的是一个列表.

plt.legend(handles=[l1, l2], labels=['up', 'down'],  loc='best')

这样我们就能分别重新设置线条对应的 label 了.

matplotlib 安装镜像 matplotlib清华镜像_Line_02

 

其中’loc’参数有多种,’best’表示自动分配最佳位置,其余的如下:

'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,

总结果如图所示:

matplotlib 安装镜像 matplotlib清华镜像_Line_03

代码示例二:调整坐标轴

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2

plt.figure()
plt.plot(x, y2)
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
plt.xlim((-1, 2))
plt.ylim((-2, 3))

new_ticks = np.linspace(-1, 2, 5)
plt.xticks(new_ticks)
plt.yticks([-2, -1.8, -1, 1.22, 3],['$really\ bad$', '$bad$', '$normal$', '$good$', '$really\ good$'])
# 使用plt.gca获取当前坐标轴信息. 使用.spines设置边框:右侧边框;使用.set_color设置边框颜色:默认白色; 
# 使用.spines设置边框:上边框;使用.set_color设置边框颜色:默认白色;

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 使用.xaxis.set_ticks_position设置x坐标刻度数字或名称的位置:bottom.(所有位置:top,bottom,both,default,none)
ax.xaxis.set_ticks_position('bottom')

# 使用.spines设置边框:x轴;使用.set_position设置边框位置:y=0的位置;(位置所有属性:outward,axes,data)
ax.spines['bottom'].set_position(('data', 0))

# 使用.yaxis.set_ticks_position设置y坐标刻度数字或名称的位置:left.(所有位置:left,right,both,default,none)
ax.yaxis.set_ticks_position('left')

# 使用.spines设置边框:y轴;使用.set_position设置边框位置:x=0的位置;(位置所有属性:outward,axes,data) 
ax.spines['left'].set_position(('data',0))

plt.show()

结果示意图:

matplotlib 安装镜像 matplotlib清华镜像_坐标轴_04

4,Annotation标注

标注图像中某些特殊的地方

当图线中某些特殊地方需要标注时,我们可以使用 annotation. matplotlib 中的 annotation 有两种方法, 一种是用 plt 里面的 annotate,一种是直接用 plt 里面的 text 来写标注.

①画出基本图,绘制一条直线:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-3, 3, 50)
y = 2*x + 1

plt.figure(num=1, figsize=(8, 5),)
plt.plot(x, y,)

 结果如图:

matplotlib 安装镜像 matplotlib清华镜像_Line_05

②移动坐标

 然后我们挪动坐标轴的位置.

ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))

结果如图:

matplotlib 安装镜像 matplotlib清华镜像_matplotlib 安装镜像_06

然后标注出点(x0, y0)的位置信息. 用plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5) 画出一条垂直于x轴的虚线.

x0 = 1
y0 = 2*x0 + 1
plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)
# set dot styles
plt.scatter([x0, ], [y0, ], s=50, color='b')

结果如图:

matplotlib 安装镜像 matplotlib清华镜像_图例_07

③添加注释annotate

 接下来我们就对(x0, y0)这个点进行标注.

plt.annotate(r'$2x+1=%s$' % y0, xy=(x0, y0), xycoords='data', xytext=(+30, -30),
             textcoords='offset points', fontsize=16,
             arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))

其中参数xycoords='data' 是说基于数据的值来选位置, xytext=(+30, -30) 和 textcoords='offset points' 对于标注位置的描述 和 xy 偏差值, arrowprops是对图中箭头类型的一些设置.

结果如图:

matplotlib 安装镜像 matplotlib清华镜像_Line_08

 ④添加注释text

plt.text(-3.7, 3, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
         fontdict={'size': 16, 'color': 'r'})

其中-3.7, 3,是选取text的位置, 空格需要用到转字符,fontdict设置文本字体.

结果如图:

matplotlib 安装镜像 matplotlib清华镜像_matplotlib 安装镜像_09

5,Matplotlib - 画布与图

Matplotlib - 画布与图

画布

figure

 

fig = plt.figure()


subplot

 

ax1 = fig.add_subplot(2, 2, 1)

调节子图间距

subplots_adjust(left, bottom, right, top, wspace, hspace)

建立等差数列值

np.linspace(start,end)  # 在指定的间隔内返回均匀间隔的数字

 wspace表示宽度,hspace表示高度

㈠subplot多合一显示

①均匀图中图

import matplotlib.pyplot as plt

plt.figure()

# 使用plt.subplot来创建小图. plt.subplot(2,2,1)表示将整个图像窗口分为2行2列, 当前位置为1. 
# 使用plt.plot([0,1],[0,1])在第1个位置创建一个小图.
plt.subplot(2,2,1)
plt.plot([0,1],[0,1])

# plt.subplot(2,2,2)表示将整个图像窗口分为2行2列, 当前位置为2. 使用plt.plot([0,1],[0,2])在第2个位置创建一个小图.
plt.subplot(2,2,2)
plt.plot([0,1],[0,2])

# plt.subplot(2,2,3)表示将整个图像窗口分为2行2列,当前位置为3. plt.subplot(2,2,3)可以简写
# 成plt.subplot(223), matplotlib同样可以识别. 使用plt.plot([0,1],[0,3])在第3个位置创建一个小图.
plt.subplot(223)
plt.plot([0,1],[0,3])

# plt.subplot(224)表示将整个图像窗口分为2行2列, 当前位置为4. 使用plt.plot([0,1],[0,4])在第4个位置创建一个小图.
plt.subplot(224)
plt.plot([0,1],[0,4])

plt.show()  # 展示

结果如图所示:

matplotlib 安装镜像 matplotlib清华镜像_matplotlib 安装镜像_10

②不均匀图中图

import matplotlib.pyplot as plt

plt.figure()

# 使用plt.subplot(2,1,1)将整个图像窗口分为2行1列, 当前位置为1. 使用plt.plot([0,1],[0,1])在第1个位置创建一个小图.
plt.subplot(2,1,1)
plt.plot([0,1],[0,1])

# 使用plt.subplot(2,3,4)将整个图像窗口分为2行3列, 当前位置为4. 使用plt.plot([0,1],[0,2])在第4个位置创建一个小图.
plt.subplot(2,3,4)
plt.plot([0,1],[0,2])

plt.subplot(235)
plt.plot([0,1],[0,3])

plt.subplot(236)
plt.plot([0,1],[0,4])

plt.show()  # 展示

结果如图所示:

matplotlib 安装镜像 matplotlib清华镜像_Line_11

subplot分格显示

图中图

次坐标

各种类型的图

条形图:

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

data = [32, 48, 21, 100]
labels = ['Jan', 'Feb', 'Mar', 'Apr']

plt.bar(np.arange(len(data)),data, align = 'edge')
plt.xticks(np.arange(len(data)),labels)
plt.show()

图形示意:

matplotlib 安装镜像 matplotlib清华镜像_图例_12

饼图:

plt.pie([10,20,30,40],labels = ['a', 'b', 'c', 'd'], autopct = "%.2f%%",explode = [0.1, 0, 0.1, 0])
plt.axis('equal')
plt.show()

图形结果:

 

matplotlib 安装镜像 matplotlib清华镜像_Line_13

㈥绘制K线图

matplotlib.finanace子包中有许多绘制金融相关图的函数接口。最新的是mpl_finance包

绘制K线图函数:

matplotlib.finance.candlestick_ochl

无需matplotlib.finance,直接使用mpl_finance中的candlestick_ochl

import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
from mpl_finance import candlestick_ochl

  

over