2017-10-20 138 views
0

我有不同长度的时间序列数据(信号),我希望在没有任何刻度和信号之间的边距的情况下进行绘制。Python/matplotlib:打印到分辨率并且没有空白/边框/边距

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

考虑:

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

例如:

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轴的标签也不应该干扰图的大小,所以它的宽度也应该被考虑。

我该如何完成打印每一个点?

+0

除去白色空间设置'plt.xlim([...])'和'plt.ylim([...])'完全匹配您的数据。如果你真的想要打印每一个点,你可能应该以矢量图形格式保存绘图,然后打印足够大。首先,我不明白你为什么要这样做。其次,我认为你永远无法确定,你的打印机驱动程序及其软件可能也会影响实际打印的内容。 –

+0

作为上述评论的替代,'plt.margins(0,0)'去除自动边距 – DavidG

+0

我不确定'边距'是否可以解决这个问题(可能只是其中的一部分)。另一方面,它完全不清楚“打印每一个点”意味着你是否有100000分。如果你有100000分600 dpi = 166英寸= 4.20米。没有4米的纸张。所以从这个意义上说,我仍然认为这个问题是不可回答的。 – ImportanceOfBeingErnest

回答

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

+0

谢谢你的出色答案。回到异常大量的数据点,这个错误会显示超过70000个点:ValueError:79105x2400像素的图像尺寸太大。它在每个方向上必须小于2^16。“对此可做些什么(除了将图分成多个部分并与另一个程序重新加入)? – user7677771

+0

使用eps作为输出格式,导出工作。 – user7677771