我有不同长度的时间序列数据(信号),我希望在比例和信号之间没有任何边距。
目标:绘制每个信号的绘图,使绘图的(物理)打印显示每个数据点。该图应保存到文件中。
鉴于:
信号的例子:
import numpy as np
Fs = 512
# Create random signal
np.random.seed(1)
data = [np.random.uniform(-10000, 20000) for i in range(5*Fs)]
如果我只是用matplotlib绘图:
import matplotlib.pyplot as plt
plt.figure(figsize=(len(data)/600,2)) # divide by 600 which is dpi resolution of printer
plt.plot(data, color = "black", linewidth = 1.0)
plt.show()
我不希望第一个数据点和Y轴之间或最后一个数据点和右边界之间有任何空白区域。 Y轴的标签也不应干扰曲线的大小,因此也应考虑其宽度。
如何打印每一个点?
答案 0 :(得分:1)
我会忽略超过30000点的观点,因为这对于打印是无稽之谈。因此,假设大约3000点的代码隐含的配置,您可以计算显示每个可打印点一个点所需的图形大小。您还需要确保线宽实际上是一个点宽。
import numpy as np
Fs = 512
# Create random signal
np.random.seed(1)
data = [np.random.uniform(-10000, 20000) for i in range(5*Fs)]
import matplotlib.pyplot as plt
dpi = 600
figheight = 4 # inch, some constant number
margin_left = 1.0 # inch
margin_right = 0.4 # inch
figwidth = (len(data)/float(dpi)) + margin_left + margin_right # inch
plt.figure(figsize=(figwidth,figheight), dpi=dpi)
plt.margins(x=0) # remove inner-axis padding of data
plt.subplots_adjust(left=margin_left/float(figwidth),
right=1.-margin_right/float(figwidth))
# use 72/dpi for linewidth such that one point is one dot
plt.plot(data, color = "black", linewidth = 72./dpi)
plt.savefig("output.png", dpi="figure")
# note that show() may not make sense,
# since it readjusts the figure size to maximum screen size
plt.show()