参考教程:点这里


目录

一张图中画一条线与两条线

设置坐标轴ax

Legend图例

Annotation 标注

tick 透明度

scatter 散点图

Bar 柱状图

Contours 等高线图

Image 图片

3D数据 

多图合并显示

分格显示

图中图

次坐标轴(左右都有轴)

Animation 动画

END


一张图中画一条线与两条线

import matplotlib.pyplot as plt
import numpy as np

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

# 使用plt.figure定义一个图像窗口. 使用plt.plot画(x ,y)曲线. 使用plt.show显示图像.
plt.figure()
plt.plot(x, y)
plt.show()

plt.figure(num=3, figsize=(8, 5),) # 编号为3;大小为(8, 5)
plt.plot(x, y2)  # 使用plt.plot画(x ,y2)曲线
plt.plot(x, y,   # 使用plt.plot画(x ,y)曲线
         color='red',     # 颜色属性(color)为红色
         linewidth=1.0,   # 曲线的宽度(linewidth)为1.0
         linestyle='--')  # 曲线的类型(linestyle)为虚线
plt.show()

 设置坐标轴ax

    设置坐标轴范围和名称:

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

  设置坐标轴刻度和名称:

plt.figure()
plt.plot(x, y2)
plt.plot(x, y, color='red', linewidth=1.0, linestyle='--')

plt.xlim((-1, 2))
plt.ylim((-2, 3))
plt.xlabel('this is x')
plt.ylabel('this is y')

new_ticks = np.linspace(-1, 2, 5) # 使用np.linspace定义范围以及个数:范围是(-1,2);个数是5
plt.xticks(new_ticks) # 使用plt.xticks设置x轴刻度:范围是(-1,2);个数是5
plt.yticks([-2, -1.8, -1, 1.22, 3], # 设置y轴刻度以及名称:刻度为[-2,..., 3]
           [r'$really\ bad$',       # -2 对应的刻度的名称
            r'$bad$',               # -1.8 对应的刻度的名称
            r'$normal$',            # -1 对应的刻度的名称
            r'$good$',              # -1.22 对应的刻度的名称
            r'$really\ good$'])     # 3 对应的刻度的名称

plt.show()

   移动matplotlib 中 axis 坐标轴的位置:

ax = plt.gca() # 使用plt.gca获取当前坐标轴信息

# 使用.spines设置边框:右侧边框;使用.set_color设置边框颜色:默认白色
ax.spines['right'].set_color('none') 

# 使用.spines设置边框:上边框;使用.set_color设置边框颜色:默认白色
ax.spines['top'].set_color('none')  

plt.show() 

    调整坐标轴:

# 使用.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()

 

Legend图例

""" 前面的内容
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2

plt.figure()
#set x limits
plt.xlim((-1, 2))
plt.ylim((-2, 3))

# set new sticks
new_sticks = np.linspace(-1, 2, 5)
plt.xticks(new_sticks)
# set tick labels
plt.yticks([-2, -1.8, -1, 1.22, 3],
           [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])

l1, = plt.plot(x, y1, label='linear line')
l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')
"""

# 参数 loc='upper right' 表示图例将添加在图中的右上角
plt.legend(loc='upper right')

# 单独修改之前的 label 信息
# !!! 需要注意的是 l1, l2,要以逗号结尾 因为plt.plot() 返回的是一个列表 !!!
plt.legend(handles=[l1, l2], labels=['up', 'down'],  loc='best')

"""
 其中’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,
"""

 

Annotation 标注

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

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

# 挪动坐标轴的位置
ax = plt.gca()
ax.spines['right'].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))
# 挪完了


x0 = 1
y0 = 2*x0 + 1

# 画出一条垂直于x轴的虚线
plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)

# 大蓝点 标注出点(x0, y0)的位置信息 
plt.scatter([x0, ], [y0, ], s=50, color='b')


plt.annotate(r'$2x+1=%s$' % y0, 
             xy=(x0, y0), 
             xycoords='data',      # 基于数据的值来选位置
             xytext=(+30, -30),    # 对于标注位置的描述
             textcoords='offset points',      # xy 偏差值
             fontsize=16,
             arrowprops=dict(arrowstyle='->', # arrowprops是对图中箭头类型的一些设置
                             connectionstyle="arc3,rad=.2"))

# -3.7, 3,是选取text的位置
# 空格需要用到转字符\ ,fontdict设置文本字体.
plt.text(-3.7, 3, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
         fontdict={'size': 16, 'color': 'r'})

 tick 透明度

x = np.linspace(-3, 3, 50)
y = 0.1*x

plt.figure()
# 在 plt 2.0.2 或更高的版本中, 设置 zorder 给 plot 在 z 轴方向排序(谁在前 谁在后)
plt.plot(x, y, linewidth=10, zorder=1)
plt.ylim(-2, 2)  # y轴坐标从-2到2

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))

for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(15)  # 重新调节字体大小
    label.set_bbox(dict(facecolor='white', edgecolor='b', alpha=0.5, zorder=2))
plt.show()

"""
bbox设置目的内容的透明度相关参数
facecolor调节 box 前景色
edgecolor 设置边框  本处设置边框为蓝
alpha设置透明度
"""

 scatter 散点图

"""
生成1024个呈标准正态分布的二维数据组 (平均数是0,方差为1) 作为一个数据集,并图像化这个数据集。
每一个点的颜色值用T来表示
"""
n = 1024    # data size
X = np.random.normal(0, 1, n) # 每一个点的X值
Y = np.random.normal(0, 1, n) # 每一个点的Y值
T = np.arctan2(Y,X) # for color value

"""
输入X和Y作为location,size=75,
颜色为T,
color map用默认值,
透明度alpha 为 50%。 
"""
plt.scatter(X, Y, s=75, c=T, alpha=.5)

# x轴显示范围定位(-1.5,1.5),并用xtick()函数来隐藏x坐标轴
plt.xlim(-1.5, 1.5)
plt.xticks(())
# y轴显示范围定位(-1.5,1.5),并用ytick()函数来隐藏y坐标轴
plt.ylim(-1.5, 1.5)
plt.yticks(())

plt.show()

 

Bar 柱状图

# 向上向下分别生成12个数据,X为 0 到 11 的整数 ,Y是相应的均匀分布的随机数据。
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)

# 使用的函数是plt.bar 参数为X和Y
plt.bar(X, +Y1)
plt.bar(X, -Y2)

plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())

# ?加颜色和数据

plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white') # facecolor设置主体颜色
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white') # edgecolor设置边框颜色为白色

# 用函数plt.text分别在柱体上方(下方)加上数值 用%.2f保留两位小数
# 横向居中对齐ha='center'
# 纵向底部(顶部)对齐va='bottom'
for x, y in zip(X, Y1):
    # ha: horizontal alignment 横向对齐
    # va: vertical alignment 纵向对齐
    plt.text(x + 0.0, y + 0.05, '%.2f' % y, ha='center', va='bottom')

for x, y in zip(X, Y2):
    # ha: horizontal alignment 横向对齐
    # va: vertical alignment 纵向对齐
    plt.text(x + 0., -y - 0.05, '%.2f' % y, ha='center', va='top')


plt.show()

 

 Contours 等高线图

# 高度值使用一个 height function f(x,y) 生成
def f(x,y):
    return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)

# 数据集即三维点 (x,y) 和对应的高度值,共有256个点
# x, y 分别是在区间 [-3,3] 中均匀分布的256个值
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)

# 用meshgrid在二维平面中将每一个x和每一个y分别对应起来,编织成栅格
X,Y = np.meshgrid(x, y)

# 使用函数plt.contourf把颜色加进去
# 位置参数分别为:X, Y, f(X,Y)
# 透明度0.75,并将 f(X,Y) 的值对应到color map的暖色组中寻找对应颜色
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)

# 等高线绘制 使用plt.contour函数划线 颜色选黑色 线条宽度选0.5
# 其中,8代表等高线的密集程度,这里被分为10个部分。如果是0,则图像被一分为二。
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=0.5)

# 加入Label,inline控制是否将Label画在线里面,字体大小为10。并将坐标轴隐藏
plt.clabel(C, inline=True, fontsize=10)
plt.xticks(())
plt.yticks(())

 

 Image 图片

这里我们打印出的是纯粹的数字,而非自然图像。

用这样 3x3 的 2D-array 来表示点的颜色,每一个点就是一个pixel。

a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
              0.365348418405, 0.439599930621, 0.525083754405,
              0.423733120134, 0.525083754405, 0.651536351379]).reshape(3,3)

# 白色代表值最大的地方,颜色越深值越小
# origin='lower'代表的就是选择的原点的位置
# 出图方式interpolation使用的是内插法中的 Nearest-neighbor 
plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')

# 右侧添加一个colorbar,shrink参数使colorbar的长度变短为原来的92%
plt.colorbar(shrink=0.95)

plt.xticks(()) # 隐藏x轴
plt.yticks(()) # 隐藏y轴
plt.show()

3D数据 

from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig) # 在窗口上添加3D坐标轴

# X, Y value
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)    # x-y 平面的网格
R = np.sqrt(X ** 2 + Y ** 2)
# height value
Z = np.sin(R)

# 将一个 colormap rainbow 填充颜色
# rstride 和 cstride 分别代表 row 和 column 的跨度
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))

# 添加 XY 平面的等高线
# zdir 选择了x,那么效果将会是对于 XZ 平面的投影
ax.contourf(X, Y, Z, zdir='z', offset=-1, cmap=plt.get_cmap('rainbow'))

 多图合并显示

subplot均匀分布的小图

plt.figure()             # 创建一个图像窗口

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

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

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

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

plt.show()               # 展示

subplot不均匀分布的图中小图 

 

plt.figure()

plt.subplot(2,1,1)        # 将整个图像窗口分为2行1列, 当前位置为1(,2,3)
plt.plot([0,1],[0,1])

plt.subplot(2,3,4)        # 将整个图像窗口分为2行3列, 当前位置为4
plt.plot([0,1],[0,2])     # 为啥位置是4呢?因为分成2行3列后,上面图1独占了第一行的1,2,3三列位置

plt.subplot(235)          # 将整个图像窗口分为2行3列, 当前位置为5
plt.plot([0,1],[0,3])

plt.subplot(236)          # 将整个图像窗口分为2行3列, 当前位置为6
plt.plot([0,3],[0,10])

plt.show()  # 展示

分格显示

1. subplot2grid分格显示

plt.figure()

"""
使用plt.subplot2grid来创建第1个小图, 
(3,3)表示将整个图像窗口分成3行3列, 
(0,0)表示从第0行第0列开始作图,
colspan=3表示列的跨度为3, 
rowspan=1表示行的跨度为1. 
colspan和rowspan缺省, 默认跨度为1.
"""
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
ax1.plot([1, 2], [1, 2])    # 坐标范围
ax1.set_title('ax1_title')  # 设置小图1的标题

ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax2.set_title('ax2_title')  # 设置小图2的标题

ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax3.set_title('ax3_title')  # 设置小图3的标题

ax4 = plt.subplot2grid((3, 3), (2, 0))
ax4.set_title('ax4_title')  # 设置小图4的标题
ax4.scatter([1, 2], [2, 2])
ax4.set_xlabel('ax4_x') # x轴的字
ax4.set_ylabel('ax4_y') # y轴的字

ax5 = plt.subplot2grid((3, 3), (2, 1))
ax5.set_title('ax5_title')  # 设置小图5的标题

 2. gridspec分格显示

import matplotlib.gridspec as gridspec
plt.figure(figsize=(8,8))      # 新建图像窗口 指定大小为800*800
gs = gridspec.GridSpec(3, 3)   # 使用gridspec.GridSpec将整个图像窗口分成3行3列
 
ax6 = plt.subplot(gs[0, :])    # gs[0, :]表示这个图占第0行和所有列
ax7 = plt.subplot(gs[1, :2])   # gs[1, :2]表示这个图占第1行和第2列前的所有列
ax8 = plt.subplot(gs[1:, 2])   # gs[1:, 2]表示这个图占第1行后的所有行和第2列
ax9 = plt.subplot(gs[-1, 0])   # gs[-1, 0]表示这个图占倒数第1行和第0列
ax10 = plt.subplot(gs[-1, -2]) # gs[-1, -2]表示这个图占倒数第1行和倒数第2列

3. subplots分格显示

 

"""
使用plt.subplots建立一个2行2列的图像窗口,
sharex=True表示共享x轴坐标, 
sharey=True表示共享y轴坐标. 
((ax11, ax12), (ax13, ax14))表示第1行从左至右依次放ax11和ax12, 第2行从左至右依次放ax13和ax14.
"""
f, ((ax11, ax12), (ax13, ax14)) = plt.subplots(2, 2, sharex=True, sharey=True)

ax11.scatter([1,2], [1,2]) # 使用ax11.scatter创建一个散点图.

plt.tight_layout() # plt.tight_layout()表示紧凑显示图像
plt.show()

 

图中图

# 导入pyplot模块
import matplotlib.pyplot as plt

# 初始化figure
fig = plt.figure()

# 创建数据
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]

"""
大图 
首先确定大图左下角的位置以及宽高 
4个值都是占整个figure坐标系的百分比
假设figure的大小是10x10,那么大图就被包含在由(1, 1)开始,宽8,高8的坐标系内
"""
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8   
ax1 = fig.add_axes([left, bottom, width, height])

# 将大图坐标系添加到figure中,颜色为r(red),取名为title
ax1.plot(x, y, 'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('title')

"""
绘制左上角的小图
"""
left, bottom, width, height = 0.2, 0.6, 0.25, 0.25
ax2 = fig.add_axes([left, bottom, width, height])
ax2.plot(y, x, 'b')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('title inside 1')

"""
绘制右下角的小图
"""
plt.axes([0.6, 0.2, 0.25, 0.25])
plt.plot(y[::-1], x, 'g') # 注意对y进行了逆序处理
plt.xlabel('x')
plt.ylabel('y')
plt.title('title inside 2')

plt.show()

 次坐标轴(左右都有轴)

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()

"""
对ax1调用twinx()方法,生成如同镜面效果后的ax2
"""
ax2 = ax1.twinx() 

ax1.plot(x, y1, 'g-')   # green, solid line
ax1.set_xlabel('X data')
ax1.set_ylabel('Y1 data_left', color='g')

ax2.plot(x, y2, 'b-') # blue
ax2.set_ylabel('Y2 data_right', color='b')

plt.show()

 Animation 动画

from matplotlib import pyplot as plt
from matplotlib import animation
import numpy as np

fig, ax = plt.subplots()

# 我们的数据是一个0~2π内的正弦曲线
x = np.arange(0, 2*np.pi, 0.01)
line, = ax.plot(x, np.sin(x))

# 构造自定义动画函数animate,用来更新每一帧上各个x对应的y坐标值,参数表示第i帧
def animate(i):
    line.set_ydata(np.sin(x + i/10.0))
    return line,

# 构造开始帧函数init
def init():
    line.set_ydata(np.sin(x))
    return line,

"""
调用FuncAnimation函数生成动画。参数说明:
   1. fig 进行动画绘制的figure
   2. func 自定义动画函数,即传入刚定义的函数animate
   3. frames 动画长度,一次循环包含的帧数
   4. init_func 自定义开始帧,即传入刚定义的函数init
   5. interval 更新频率,以ms计
   6. blit 选择更新所有点,还是仅更新产生变化的点。应选择True,但mac用户请选择False
"""
ani = animation.FuncAnimation(fig=fig,
                              func=animate,
                              frames=100,
                              init_func=init,
                              interval=20,
                              blit=True)

plt.show()
# 将动画以mp4格式保存下来,但首先要保证你已经安装了ffmpeg 或者mencoder
# ani.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])

 

END

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐