最近踩坑合集

最近踩坑合集

  上班恰好有1个月了,每天都在写 markdown,却没有写自己的 markdown 总结,以后尝试每周总结一下。

  最近在做的是数据可视化,主要涉及的技术栈是 numpymatplotlib, pandas 内容上还是比较简单的,主要是对数据进行整理和绘图展示,在实践中还是踩了不少坑,这里整理一下。

问题一:matplotlib绘制逆变波形图

(方波转正弦交流电示意图)

  

  这个看起来难度不大,但是我在搜资料的时候,一堆人使用 傅里叶变换进行拟合,这可难倒没学离散的我了,所以采用了土方法,利用 分割 + 间距 的方法。

  思路就是自己定义个数据集,控制间距,分割以后对一些位置进行改变,最后得到所需要的图形。

1
2
3
4
5
6
7
8
9
#新建一个代码块
m=[8,16,32,48,64]

j = 1
for i in range(len(m)-1):
m.insert(i+j,15)
j+=1

print("m=",m)

m= [8, 15, 16, 15, 32, 15, 48, 15, 64]

  我们先定义一个 m 列表,来设置我们把 1/4 个周期分割的份数,那么中间肯定有间隔时间,我们加上时间间隔。

  我们把 1/4 个周期的数据数量已经分好了,那我们我们需要把它们加起来算出一个整数,这个整数就是我们 1/4 个周期所需要的数据数量。

  新建一个代码块,计算该整数并存储到变量 M 中。

1
2
3
4
5
#新建一个代码块
M=0
for i in m:
M+=i
print("M=",M)

M= 228

  现在我们得到了 1/4 个周期的数据数量,再乘以 4 就是我们一个周期的数据总数量了。

  新建一个代码块,执行代码块查看效果:

1
2
3
4
5
6
7
8
9
10
11
#新建一个代码块
X= 0
my_X=[]
for i in range(4*M + 1):
my_X.append(X)
# 每份数据量为 pi/2 除以 M 份
X+=np.pi/(2*M)

create_figure()
plt.plot(my_X,np.sin(my_X))
plt.show()
(构造正弦波)

  

  因为我们所划分的是 1/4 个周期,所以 每一份的数据量大小为 pi/4 除以 M 份,然后通过 list.append 函数添加到列表中去,我们就获得我们所需要的数据了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 生成矩形电波
def period_new1(x):
x1=np.sin(x)
#根据条件筛选出大于0的数据并修改
y=np.where(x1>0,1,-1)

#将第一位和最后一位置为 0
y[0]=0
y[-1]=0

return y

# 将矩形电波其中部分置为 0 模拟 PWM 波形
def period_new2(y):
idx = 0
for j in range(2):
for i in m:
idx+= i
if i!= 64 and i!= 15:
y[idx:idx+15] = 0


for i in reversed(m):
idx+= i
if i!= 8 and i!= 15:
y[idx:idx+15] = 0

return y

create_figure()
my_y1= period_new1(my_X)
my_y2= period_new2(my_y1.copy())

plt.plot()
plt.plot(my_X,np.sin(my_X),'b-')
plt.plot(my_X,my_y1, color='r', linestyle='-');
plt.plot(my_X,my_y2,color='#2ea338', linestyle='-')
plt.show()
(方波与正弦波)

  

问题二: 解决jpyter node 中使用 matplotlib 画图中文字体的问题

1
2
3
4
5
6
7
# 新建代码块
from pylab import mpl
import matplotlib
# 更换当前字体库为 SimHei ->黑体
matplotlib.rc("font",family='SimHei')
# 解决保存图像是负号'-'显示为方块的问题
plt.rcParams["figure.dpi"] =mpl.rcParams['axes.unicode_minus'] = False

  因为每个电脑的字体库可能有所不同,所以如果出现缺少 SimHei 的话会出现 error 错误,并且无法渲染中文字体,那么可以新建代码块运行以下代码:

1
2
3
4
5
6
7
8
9
10
# 新建代码块
# 查询当前系统所有字体
from matplotlib.font_manager import FontManager
import subprocess

mpl_fonts = set(f.name for f in FontManager().ttflist)

print('all font list get from matplotlib.font_manager:')
for f in sorted(mpl_fonts):
print('\t' + f)

  可以尝试将 matplotlib.rc("font",family='SimHei') 中的 SimHei 更换为 其他 字体尝试,一般中文字体库会以 拼音 的形式存在。

  当然还有很多一劳永逸的方式,直接更改文件就好了,但是这种方法对于在云平台使用起来的话更加的灵活。