11.11大促主会场
新人页面
精选商品
首月0月租体验,领12个月京东PLUS
自营热卖

1. 科研绘图之 matplotlib 基本语法

不奢求爱情 6天前   阅读数 10 0

matplotlib 基本功能

  matplotlib 是 Python 的一个绘图库,使用它可以很方便地绘制出版质量级别的图形图片。本节主要介绍的是 matplotlib 的基本绘图功能,即在二维平面坐标系中绘制连续的曲线。

  1. 设置线型、线宽和颜色;
  2. 设置坐标轴的范围;
  3. 设置坐标刻度;
  4. 设置坐标轴;
  5. 图例;
  6. 特殊点;
  7. 备注;

matplotlib 基本功能详解

matplotlib.pyplot 绘图核心API

import numpy as np
import matplotlib.pyplot as plt

# x_array:<序列> 水平坐标序列
# y_array:<序列> 竖直坐标序列
plt.plot(x_array, y_array)
# 显示图表
plt.show()

案例:绘制一条正弦曲线

import numpy as np
import matplotlib.pyplot as plt

# 在-2pi到2pi之间等间隔生成100个点
x_array = np.linspace(-2 * np.pi, 2 * np.pi, 100)
y_array = np.sin(x_array)
plt.plot(x_array, y_array)
# 将图像以.jpg的格式保存
plt.savefig("sinx.jpg")
plt.show()

在这里插入图片描述

1、绘制水平线与垂直线

import numpy as np
import matplotlib.pyplot as plt

# vertical lines 绘制垂直线
plt.vlines(xval, ymin, ymax, ...)
# horizotal lines 绘制水平线
plt.hlines(yval, xmin, xmax, ...)
# 显示图表
plt.show()
import numpy as np
import matplotlib.pyplot as plt

# 等间隔拆分1000个点
x = np.linspace(-np.pi, np.pi, 1000)
y = np.sin(x)
plt.plot(x, y)

# 绘制一条水平线和垂直线(线条颜色是黑色)
# 同时绘制多条竖直线
plt.vlines([-2, -1, 0, 1, 2], -1, 1, colors='blue')  
plt.hlines(0, -3, 3, color='red')
plt.show()

图中绘制了 5 条垂直线( x = [-2, -1, 0, 1, 1], ymin = -1, ymax = 1 )和 1 条水平线( y = 0, xmin = -3, xmax = 3 ).

在这里插入图片描述

2、线型、线宽和颜色

  1. 线型:linestyle = [ ’ - ', ’ – ', ’ -. ', ’ : ’ ];

  2. 线宽:linewidth = 数字;

  3. 颜色:color = 英文颜色单词 或 常用颜色的英文首字母 或 #495434 或 (56,54,20);

  4. 透明度:alpha = 浮点数值;

比如:plt.plot(x_array, y_array, linestyle='--', linewidth=2, color='r', alpha=0.5)

import numpy as np
import matplotlib.pyplot as plt

# 线性拆分1000个点
x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)
cosx = np.cos(x)

plt.plot(x, sinx, linestyle="-.", linewidth=2, color="dodgerblue", alpha=0.8)
plt.plot(x, cosx, linestyle='--', linewidth=2, color='orangered', alpha=1)
plt.savefig("cosx.png")
plt.show()

在这里插入图片描述

3、设置坐标轴范围

案例:以 sigmoid 函数为例,设置 x x x 轴和 y y y 轴的坐标轴范围

# x_limt_min:<float> x轴范围最小值
# x_limt_max:<float> x轴范围最大值
plt.xlim(x_limt_min, x_limt_max)

# y_limt_min:<float> y轴范围最小值
# y_limt_max:<float> y轴范围最大值
plt.ylim(y_limt_min, y_limt_max)
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-10, 10, 1000)
y = 1/(1 + np.exp(-x))
# 设置坐标轴的范围
plt.xlim(-8, 8)  # 将x轴的范围设为[-8, 8]
plt.ylim(-0.01, 1.01) # 将y轴的范围设为[-0.01, 1.01]
plt.plot(x, y, linestyle='-', linewidth=2, color='red', alpha=0.8)
plt.show()

在这里插入图片描述

4、设置坐标刻度

案例:把正弦函数 y = s i n x y=sinx y=sinx 的横坐标刻度设置为:0、 π 2 \dfrac{\pi}{2} 2π π \pi π 3 π 2 \dfrac{3\pi}{2} 23π 2 π 2\pi 2π.

# x_val_list:x轴刻度值序列
# x_text_list:x轴刻度标签文本序列[可选]
plt.xticks(x_val_list, x_text_list )
# y_val_list:y轴刻度值序列
# y_text_list:y轴刻度标签文本序列[可选]
plt.yticks(y_val_list, y_text_list)

【推荐】:设置刻度值的时候,数值序列与文本序列的长度要一一对应且相同。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)

# 设置坐标刻度
x_val_list = [-np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi]
x_text_list = [r'-$\pi$', r'-$\dfrac{\pi}{2}$', r'$0$', r'$\dfrac{\pi}{2}$', r'-$\pi$']
plt.xticks(x_val_list, x_text_list)
plt.plot(x, sinx, linestyle="-", linewidth=2, color="orangered", alpha=0.9)
plt.savefig("ysinx.jpg")
plt.show()

在这里插入图片描述

5、设置坐标轴

从上面绘制的曲线可以看到,坐标轴有上下左右,而实际绘制数学函数的图象时,我们的直角坐标系都是通过原点且相互垂直的。因此,matplotlib 设置有四个坐标轴名:left / right / top / bottom。

# 获取当前坐标轴
ax = plt.gca()
# 获取其中某个坐标轴(无非就是top/bottom/left/right)
axis = ax.spines['坐标轴名']
# 设置坐标轴的位置
# val:参照值
axis.set_position((type, val))
# 设置坐标轴的颜色
# color:<str> 颜色值字符串
axis.set_color(color)

例如:ax.spines['left'].set_position(('data', 0)),先获取到当前的坐标轴,然后设置坐标轴的位置或颜色值。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)
plt.plot(x, sinx, linestyle='-.',linewidth=2, color='red', alpha=0.9)

# 设置坐标刻度
x_val_list = [-np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi]
x_text_list = [r'-$\pi$', r'-$\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'-$\pi$']
plt.xticks(x_val_list, x_text_list)
# 注意:这里我没有设置纵坐标的文本序列
plt.yticks([-1, -0.5, 0.5, 1])

# 修改坐标轴
ax = plt.gca()
ax.spines['top'].set_color('none')  # 表示不显示top坐标轴
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
plt.show()

在这里插入图片描述

6、图例

案例:显示两条曲线的图例,并测试 loc 属性;

设置图例的位置:loc : <关键字参数>制定图例的显示位置(如果不设置 loc,则显示默认位置)

plt.plot(x, y, ... label='', ...)
plt.legend(loc='')
Location String Location Code
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
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)
cosx = 1/2 * np.cos(x)

plt.plot(x, sinx, linestyle='-.', linewidth=2, color='dodgerblue', label=r'$y=sin(x)$')
plt.plot(x, cosx, linestyle='--', linewidth=2, color='orangered', label=r'$y=\frac{1}{2}cos(x)$')

# 设置坐标刻度
x_val_list = [-np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi]
x_text_list = [r'-$\pi$', r'-$\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'-$\pi$']
plt.xticks(x_val_list, x_text_list)
plt.yticks([-1, -0.5, 0.5, 1])

# 修改坐标轴
ax = plt.gca()
ax.spines['top'].set_color('none')  # 不显示top坐标轴
ax.spines['right'].set_color('none')
# 这里的data表示的是数据坐标系
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
plt.legend(loc='upper left')
plt.show()

在这里插入图片描述

7、特殊点

案例:绘制激活函数 sigmoid 曲线上的特殊点;

# xarray: <序列> 所有需要标注点的水平坐标组成的序列
# yarray: <序列> 所有需要标注点的垂直坐标组成的序列
plt.scatter(xarray, yarray, 
       marker='', 		# 点型 ~ matplotlib.markers
       s=70, 			# 大小
       edgecolor='', 	# 边缘色
       facecolor='',	# 填充色
       zorder=3			# 绘制图层编号 (编号越大,图层越靠上)
)

说明:标注特殊点用到了 pyplot 的散点图绘制方法

Matplotlib Point 样式(marker 属性)

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-20, 20, 1000)
y = 1/(1+np.exp(-x))
plt.plot(x, y, linestyle='-',linewidth=2, color='red', alpha=0.9, label=r'$\frac{1}{1+e^{-x}}$')

# 设置坐标刻度
plt.yticks([0.5, 1])

# 修改坐标轴
ax = plt.gca()
ax.spines['top'].set_color('none')  # 不显示top坐标轴
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))

# 绘制特殊点(列表)
pointx = [0]
pointy = [0.5]
plt.scatter(pointx, pointy, marker='o', s=50, color='red', label='sample points',zorder=3)
# 给图像设置标题
plt.title(r"Function : $y=\dfrac{1}{1+e^{-x}}$")
plt.legend()
plt.show()

在这里插入图片描述

8、备注

案例:在某条曲线上的点添加备注,指明函数方程与值。

# 在图表中为某个点添加备注
plt.annotate(
    r'($\frac{\pi}{2}, 0)$',			# 备注显示的文本内容
    xycoords='data',			# 备注目标点所使用的坐标系(data表示数据坐标系)
    xy=(x, y),	 				# 目标点的坐标
    textcoords='offset points',	# 参照点的偏移坐标系
    xytext=(x, y),				# 备注文本的坐标
    fontsize=14,				# 备注文本的字体大小
    arrowprops=dict()			# 使用字典定义文本指向目标点的箭头样式
)

# arrowprops字典参数的常用key
arrowprops = dict(
    arrowstyle='->',		 # 定义箭头样式
    connectionstyle=''	 # 定义连接线的样式(angle3、arc3、bar)
)

个人觉得,arrowstyle 的参数很多,只需要记住 -> 就足够了。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)
cosx = 1/2 * np.cos(x)

plt.plot(x, sinx, linestyle='-.', linewidth=2, color='dodgerblue', label=r'$y=sin(x)$')
plt.plot(x, cosx, linestyle='--', linewidth=2, color='orangered', label=r'$y=\frac{1}{2}cos(x)$')

# 设置坐标刻度
x_val_list = [-np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi]
x_text_list = [r'-$\pi$', r'-$\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'-$\pi$']
plt.xticks(x_val_list, x_text_list)
plt.yticks([-1, -0.5, 0.5, 1])

# 修改坐标轴
ax = plt.gca()
ax.spines['top'].set_color('none')  # 不显示top坐标轴
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
plt.legend(loc='upper left')


# 绘制特殊点(列表)
pointx = [np.pi / 2, np.pi / 2]
pointy = [1, 0]
plt.scatter(pointx, pointy, marker='o', s=50, color='red', label='sample points',zorder=3)

# 在图表中为某个点添加备注
plt.annotate(
    r'$(\frac{\pi}{2}, 1)$',           
    xycoords='data',
    xy=(np.pi / 2, 1),
    textcoords='offset points',
    xytext=(50, 30),
    fontsize=14,
    arrowprops=dict(
        arrowstyle='->',
        connectionstyle='angle3'
    )
)
plt.annotate(
    r'$(\frac{\pi}{2}, 0)$',           
    xycoords='data',
    xy=(np.pi / 2, 0),
    textcoords='offset points',
    xytext=(-50, -30),
    fontsize=14,
    arrowprops=dict(
        # 箭头样式
        arrowstyle='->',
        # 设置连接线样式
        connectionstyle='arc3'
    )
)

plt.show()

在这里插入图片描述


注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: