Matplotlib
1、基本用法
import matplotlib.pyplot as plt
import numpy as np
# 从-1到1,均匀分布50个点
x = np.linspace(-1, 1, 50)
y = 2 * x + 1
# 画图但不展示
plt.plot(x, y)
# 展示
plt.show()
2、figure 图像
① 多个窗口
import matplotlib.pyplot as plt
import numpy as np
# 从-1到1,均匀分布50个点
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x ** 2
# 标明第一个窗口
plt.figure()
# 画图但不展示
plt.plot(x, y1)
# 标明第二个窗口
plt.figure()
# 画图但不展示
plt.plot(x, y2)
# 展示
plt.show()
② 更多参数
修改窗口的序号和大小。
# num指定序号,figsize指定窗口大小
plt.figure(num=3, figsize=(8, 5))
在一个窗口里面显示多个函数。
import matplotlib.pyplot as plt
import numpy as np
# 从-1到1,均匀分布50个点
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x ** 2
# 标明第一个窗口
plt.figure()
# 画图但不展示
plt.plot(x, y1)
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')
# 展示
plt.show()
3、设置坐标轴
① 修改坐标轴的标尺
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x, y1)
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')
# 设置x轴的取值范围
plt.xlim((-1, 2))
# 设置y轴的取值范围
plt.ylim((-3, 2))
# 设置x轴的标签
plt.xlabel('I am X')
# 设置y轴的标签
plt.ylabel('I am Y')
# 设置新的小标
new_ticks = np.linspace(-3, 3, 50)
# 替换为x轴小标
plt.xticks(new_ticks)
# 在对应小标处设置文字
plt.yticks([-2, -1.8, -1, 1,22, 3],
['really bad', 'bad', 'normal', 'good', 'really good'])
# 修改文字字体
# plt.yticks([-2, -1.8, -1, 1,22, 3],
# [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])
# latex语法打印数学符号
# r'$bad\ \alpha$'
plt.show()
② 修改坐标轴的位置
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x, y1)
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')
# gca='get current axis'
# 取得当前图片的坐标轴
ax = plt.gca()
# .spines脊梁即图片的上下左右四个边框
# 去除右边框和上边框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 用下边框代替x轴
ax.xaxis.set_ticks_position('bottom')
# 用左边框代替y轴
ax.yaxis.set_ticks_position('left')
# 把x轴对齐到y轴的0
ax.spines['bottom'].set_position(('data', 0))
# 把y轴对齐到x轴的0
ax.spines['left'].set_position(('data', 0))
plt.show()
4、legend 图例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
# 添加标签label
plt.plot(x, y1, label='up')
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='down')
# 添加图例
plt.legend()
plt.show()
更多参数
# 变量名后面一定要跟一个逗号
line1, = plt.plot(x, y1, label='up')
line2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='down')
# 重新设置label:handles=[line1, line2], labels=['aaa', 'bbb']
# 设置图例的位置loc
plt.legend(handles=[line1, line2], labels=['aaa', 'bbb'], loc='best')
5、添加注解
① 绘制点和直线
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x, y1)
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
x0 = 0.35
y0 = 2 * x0 + 1
# 绘制散点
# s设置大小
plt.scatter(x0, y0, s=50, color='b')
# [x0, x0]是横坐标集合,[y0, 0]是纵坐标集合
# 表示(x0, y0)和(x0, 0)这两个点
plt.plot([x0, x0], [y0, 0], 'k--', lw=2.5)
plt.show()
② 添加图像注解
参数说明
- xycoords=‘data’ 基于我的 data
- xytext=(+30, -30), textcoords=‘offset points’ 注释偏移所选点的位置
- arrowprops=dict(arrowstyle=‘->’, connectionstyle=‘arc3, rad=.2’) 箭头样式
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'))
③ 添加文字注解
plt.text(-1.5, 2, r'$This\ the\ some\ text.\ \mu\ \sigma_i\ \alpha_t$',
fontdict={
'size': 16, 'color': 'r'})
6、tick 能见度
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x, y1)
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(12)
# alpha=0.7是透明度
label.set_bbox(dict(facecolor='pink', edgecolor='None', alpha=0.7))
plt.show()
bbox 就是小标自己的背景,是一个方框的形式。
plt.annotate(r'bbox', xy=(-0.2, 2), xycoords='data',
xytext=(-60, +30), textcoords='offset points',
fontsize=18,
arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=.5'))
7、scatter 散点图
import matplotlib.pyplot as plt
import numpy as np
n = 1024
# 随机生成一系列横坐标和纵坐标
X = np.random.normal(0, 1, n)
Y = np.random.normal(0, 1, n)
# 设置点的颜色
T = np.arctan2(Y, X)
# 绘制散点
plt.scatter(X, Y, s=75, c=T, alpha=0.5)
plt.xlim((-1.5, 1.5))
plt.ylim((-1.5, 1.5))
# 去除小标
plt.xticks(())
plt.yticks(())
plt.show()
只想看一条线上的散点:
import matplotlib.pyplot as plt
import numpy as np
plt.scatter(np.arange(5), np.arange(5))
# 去除小标
plt.xticks(())
plt.yticks(())
plt.show()
8、bar 柱状图
import matplotlib.pyplot as plt
import numpy as np
n = 12
# 随机生成一系列横坐标和纵坐标
X = np.arange(n)
Y1 = (1-X/float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1-X/float(n)) * np.random.uniform(0.5, 1.0, n)
# 绘制柱bar状图
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
plt.xlim((-1, n))
plt.ylim((-1.2, 1.2))
plt.xticks(())
plt.yticks(())
plt.show()
在柱头上方或下方添加注释:
- ha 用于设置水平对齐
- va 用于设置垂直对齐
- x, y+0.02 用于设置相对位置
# 添加注释
for x, y in zip(X, Y1):
print(y)
# ha: horizontal alignment
plt.text(x, y+0.02, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
# ha: horizontal alignment
plt.text(x, -y-0.02, '-%.2f' % y, ha='center', va='top')
9、contour 等高线
地图就是一个网格,每一个点都有一个值,该值就是该点的高度。
import matplotlib.pyplot as plt
import numpy as np
def f(x, y):
# 根据x和y计算高度
return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
n = 256
# 随机生成一系列横坐标和纵坐标
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
# 定义网格,把x和y绑定为网格的输入值
X, Y = np.meshgrid(x, y)
# 绘制等高线
# cmap=plt.cm.hot设置颜色
# 8表示等分成8+2份
plt.contourf(X, Y, f(X, Y), 8, alpha=0.75, cmap=plt.cm.hot)
# 设置线条
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=0.5)
# 添加标签
# inline=True添加在线里面
plt.clabel(C, inline=True, fontsize=10)
plt.xticks(())
plt.yticks(())
plt.show()
10、image 图片
import matplotlib.pyplot as plt
import numpy as np
# image data
a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
0.365348418405, 0.439599930621, 0.525083754405,
0.423733120134, 0.525083754405, 0.651536351379]).reshape(3,3)
"""
for the value of "interpolation", check this:
http://matplotlib.org/examples/images_contours_and_fields/interpolation_methods.html
for the value of "origin"=['upper', 'lower'], check this:
http://matplotlib.org/examples/pylab_examples/image_origin.html
"""
plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')
plt.colorbar(shrink=.92)
plt.xticks(())
plt.yticks(())
plt.show()
11、3D 数据
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
# 设置三维坐标轴
ax = Axes3D(fig)
# x轴和y轴
x = np.arange(-4, 4, 0.25)
y = np.arange(-4, 4, 0.25)
# 定义网格,把x和y绑定为网格的输入值
X, Y = np.meshgrid(x, y)
# 计算高度值Z
R = np.sqrt(X ** 2 + Y ** 2)
Z = np.sin(R)
# 绘制3D图
# rstride=1, cstride=1设置线条的行跨度和列跨度
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
# 绘制等高线
# zdir='z'在z轴方向上投影
# offset=-2设置压到z=-2的平面
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap='rainbow')
ax.set_zlim(-2, 2)
plt.show()
12、subplot 多合一显示
import matplotlib.pyplot as plt
plt.figure()
# 分成两行两列,占第一个
plt.subplot(2, 2, 1)
# 设置坐标轴范围,前为x轴范围,后为y轴范围
plt.plot([0, 1], [0, 1])
# 分成两行两列,占第二个
# 可以简写成222
plt.subplot(222)
plt.plot([0, 1], [0, 2])
plt.subplot(223)
plt.plot([0, 1], [0, 3])
plt.subplot(224)
plt.plot([0, 1], [0, 4])
plt.show()
令每个图片占用的空间大小不同
不同图片按照自己的理解去划分窗口空间,只要分配合理,就能做到互不干扰。
import matplotlib.pyplot as plt
plt.figure()
# 分成两行一列,占第一个
plt.subplot(2, 1, 1)
# 设置坐标轴范围,前为x轴范围,后为y轴范围
plt.plot([0, 1], [0, 1])
# 分成两行三列,占第四个
plt.subplot(2, 3, 4)
plt.plot([0, 1], [0, 2])
plt.subplot(2, 3, 5)
plt.plot([0, 1], [0, 3])
plt.subplot(2, 3, 6)
plt.plot([0, 1], [0, 4])
plt.show()
13、grid_subplot 多合一显示
方法一
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure()
# 三行三列(3, 3),从第0行第0列开始(0, 0),列跨度colspan
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
ax1.plot([1, 2], [1, 2])
ax1.set_title('ax1_title')
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax4.scatter([1, 2], [2, 2])
ax4.set_xlabel('ax4_x')
ax4.set_ylabel('ax4_y')
ax5 = plt.subplot2grid((3, 3), (2, 1))
plt.tight_layout()
plt.show()
方法二
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure()
gs = gridspec.GridSpec(3, 3)
# :表示占用全部行或列
# :2表示占用2之前的全部行或列
# 1:表示占用1之后的全部行或列
ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :2])
ax3 = plt.subplot(gs[1:, 2])
ax4 = plt.subplot(gs[-1, 0])
ax5 = plt.subplot(gs[-1, -2])
plt.show()
方法三
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure()
# 共享x轴,共享y轴
# 2, 2两行两列
# (ax11, ax12), (ax21, ax22)布局
f, ((ax11, ax12), (ax21, ax22)) = plt.subplots(2, 2, sharex=True, sharey=True)
# 画个散点图
ax11.scatter([1,2], [1,2])
plt.show()
14、plot in plot 图中图
import matplotlib.pyplot as plt
fig = plt.figure()
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]
# 下面的参数设置的都是百分比
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
# 传入参数
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x, y, 'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('title')
# 参数也可以直接传
ax2 = fig.add_axes([0.2, 0.6, 0.25, 0.25])
ax2.plot(y, x, 'b')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('title inside 1')
plt.show()
使用 plt 也可以画:
plt.axes([0.6, 0.2, 0.25, 0.25])
# 下述设置都默认用于上面这个axes
# y[::-1]把y值逆序
plt.plot(y[::-1], x, 'g')
plt.xlabel('x')
plt.ylabel('y')
plt.title('title inside 2')
15、secondary axis 主次坐标轴
import matplotlib.pyplot as plt
import numpy as np
# 随便编造一些数据
x = np.arange(0, 10, 0.1)
y1 = 0.05 * x**2
y2 = -1 * y1
fig, ax1 = plt.subplots()
# ax2由ax1中心对称而来
ax2 = ax1.twinx()
ax1.plot(x, y1, 'g-')
ax2.plot(x, y2, 'b-')
ax1.set_xlabel('X data')
ax1.set_ylabel('Y1 data', color='g')
ax2.set_ylabel('Y2 data', color='b')
plt.show()
16、animation 动画
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
fig, ax = plt.subplots()
x = np.arange(0, 2*np.pi, 0.01)
# line列表返回值的第一个
line, = ax.plot(x, np.sin(x))
# 更新y值
def animate(i):
line.set_ydata(np.sin(x + i/10.0))
return line,
def init():
line.set_ydata(np.sin(x))
return line,
# frames=100每一百个帧循环一次
# interval=20每20ms更新一次
# blit=False更新全部的点
ani = animation.FuncAnimation(fig=fig, func=animate, frames=100, init_func=init,
interval=20, blit=False)
plt.show()