matplotlib作图示例——阻尼衰减曲线、XRD数据绘图、三角函数绘图、超越函数绘图、正态分布随机数(插值多项式)、饼图
源码地址: handle_matplotlib_pic
代码只在mpl_pic.py
中、XRD数据是XRD_AFO.csv
方便的话,帮忙点个star~
1.阻尼衰减曲线
注意点
- 线条样式和颜色
# plot()函数里面的参数 分别代表 颜色为蓝色,线宽1,线类型为隔断的线条- -(正常线条为-)
color='blue', linewidth=1, linestyle="--"
- 右上角图例的制作
图例中包含希腊字母更详细的信息参考希腊字母写法
# 图例描述文字 plot()函数里面的label参数,$$符号之间标明有特殊的表达方式
# _下划线是注脚样式的字符(小一号的字符,德尔塔在字母p的左下角)、\delta是小写希腊字母德尔塔的表示方式
label=r"exp$_\delta$ecay"
# $x^{2}$代表x的平方,幂次数2在x的右上角
label="cos($x^{2}$)"
# 图例位置 上 右
plt.legend(loc='upper right')
- 横纵左表和标题的添加
# 标题 横纵轴描述
plt.title(u"阻尼衰减曲线")
plt.xlabel("时间(s)")
plt.ylabel("幅度(mV)")
- 阴影的绘制
# 阴影区
# 定义横轴范围0.8到3
a,b = 0.8, 3
xf = t1[np.where((t1 > a) & (t1 < b))]
plt.fill_between(xf, f(xf), alpha=0.25) # 填充
# plt.fill_between(xf,f(xf),f2(xf), alpha=0.25) # 自定义阴影区
2.XRD数据绘图
本来蛮简单的,被我想复杂了,emm浪费了一些时间,详情见源码
3.正弦、余弦、正切图案及画布布局方式
注意点
- 标注的画法——Matplotlib 中文用户指南 4.5 标注
效果图如下,这种是gs = gridspec.GridSpec(2, 2)
将绘图区分成两行两列的方式
这种方式比较固定,子图之间不能覆盖,死板一些plt.subplot(221)
代表2×2画布第一块,可以看到第三块的位置是空白,所以采取第一种方式,仓库没保留第二种代码,放在这里
'''
@Author: randolph
@Date: 2020-06-11 22:47:59
@LastEditors: randolph
@LastEditTime: 2020-06-12 00:58:02
@version: 1.0
@Contact: cyg0504@outlook.com
@Descripttion: 第二种绘图方法
https://blog.csdn.net/wizardforcel/article/details/54782628
'''
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用于正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
x = np.arange(0, 100)
# 获取x坐标
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
# 获取y坐标
sin, cos = np.sin(X), np.cos(X)
# 子图1 绘制正弦曲线
plt.subplot(221)
plt.plot(X, sin, "b-", lw=2.5, label="正弦")
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))
ax.set_title('正弦曲线')
plt.xticks([-np.pi, -np.pi * 2 / 3, -np.pi / 3, np.pi / 3, np.pi * 2 / 3, np.pi],
[r'-$\pi$', r'-$2\pi/3$', r'-$\pi/3$', r'$\pi/3$', r'$2\pi/3$', r'$\pi$'])
t = np.pi / 6 # 设定点x轴值
plt.scatter([t, ], [np.sin(t), ], 30, color='r')
plt.annotate(r'$\sin(\frac{\pi}{6})=\frac{1}{2}$',
xy=(t, np.sin(t)), # 点的位置
xycoords='data', # 注释文字的偏移量
xytext=(50, 50), # 文字离点的横纵距离
textcoords='offset points',
fontsize=13, # 注释的大小
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.5")) # 箭头指向的弯曲度
plt.plot([t, 0], [0.5, 0.5], color='r', linewidth=1, linestyle=":") # 作y轴垂线(t, 0.5)(0, 0.5)
plt.plot([t, t], [0.5, 0], color='r', linewidth=1, linestyle=":") # 作y轴垂线(t, 0.5)(t, 0)
plt.legend(loc='upper left')
# 子图2 不画
# plt.subplot(222)
# plt.plot(x, -x)
# 子图3 绘制余弦曲线
plt.subplot(223)
plt.plot(X, cos, "r-", lw=2.5, label="余弦")
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))
ax.set_title('余弦曲线')
plt.xticks([-np.pi, -np.pi * 2 / 3, -np.pi / 3, np.pi / 3, np.pi * 2 / 3, np.pi],
[r'-$\pi$', r'-$2\pi/3$', r'-$\pi/3$', r'$\pi/3$', r'$2\pi/3$', r'$\pi$'])
t = np.pi / 3 # 设定点x轴值
plt.scatter([t, ], [np.cos(t), ], 30, color='b')
plt.annotate(r'$\cos(\frac{\pi}{3})=\frac{1}{2}$',
xy=(t, np.cos(t)), # 点的位置
xycoords='data', # 注释文字的偏移量
xytext=(25, 25), # 文字离点的横纵距离
textcoords='offset points',
fontsize=13, # 注释的大小
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.3")) # 箭头指向的弯曲度
plt.plot([t, 0], [0.5, 0.5], color='b', linewidth=1, linestyle=":") # 作y轴垂线(t, 0.5)(0, 0.5)
plt.plot([t, t], [0.5, 0], color='b', linewidth=1, linestyle=":") # 作y轴垂线(t, 0.5)(t, 0)
plt.legend(loc='upper left')
# 子图4 绘制正切曲线
plt.subplot(224)
plt.plot(X, np.tan(X), "g", lw=2.5, label="正切")
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))
ax.set_title('正切曲线')
plt.xticks([-np.pi, -np.pi * 2 / 3, -np.pi / 3, np.pi / 3, np.pi * 2 / 3, np.pi],
[r'-$\pi$', r'-$2\pi/3$', r'-$\pi/3$', r'$\pi/3$', r'$2\pi/3$', r'$\pi$'])
plt.legend(loc='upper left')
plt.show()
4.超越函数绘图
超越函数为cos(num_list) + x**4 + x**3 + 198 + e**3 - log(x+1)
num_list为np.linspace()生成的数组
5.正态分布随机数、插值多项式
np.random.normal()
生成正态分布的数,用 quadratic
插值(2阶B样条曲线插值)或者 cubic
插值获得的结果都是一致的
6.饼图
def pic_4():
'''图四 饼图
用了apply方法将df数据某一列元素转换成浮点数
'''
def convert2int(d: str) -> float:
# print(d)
return float(d.split(' ')[0].split('$')[1])
import pandas as pd
ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
src_file = os.path.join(ROOT_PATH, "2012-19sport.csv") # 绝对路径拼接
file = pd.read_csv(src_file)
df = pd.DataFrame(file)
df_2013 = df[df['Year'] == 2013] # 选取Year列为2013的数据
# 将 Endorsements 列处理成浮点数
df_2013['Endorsements'] = df_2013['Endorsements'].apply(lambda x: convert2int(x))
endorsements = df_2013.groupby(by='Sport')['Endorsements'].sum()
names = endorsements.index.to_list()
# explode = [x / sum(endorsements) for x in endorsements]
plt.pie(x=endorsements.to_list(), labels=names, startangle=60, autopct='%1.1f%%') # explode=explode,
plt.title('2013年球类收入饼图')
plt.show()