Python / matplotlib:打印到分辨率,没有空格/边框/边距

时间:2017-10-20 08:16:44

标签: python matplotlib plot

我有不同长度的时间序列数据(信号),我希望在比例和信号之间没有任何边距。

目标:绘制每个信号的绘图,使绘图的(物理)打印显示每个数据点。该图应保存到文件中。

鉴于:

  1. 打印机,最大打印分辨率为600 dpi。
  2. 信号具有不同数量的数据点(从30000到100000)。
  3. 信号的例子:

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

    data plot

    我不希望第一个数据点和Y轴之间或最后一个数据点和右边界之间有任何空白区域。 Y轴的标签也不应干扰曲线的大小,因此也应考虑其宽度。

    如何打印每一个点?

1 个答案:

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

enter image description here