【Python】Matplotlib 入门

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

猜你喜欢

转载自blog.csdn.net/m0_64140451/article/details/131749482