【问题标题】:Python / matplotlib: print to resolution and without white space / borders / marginsPython / matplotlib:打印到分辨率并且没有空白/边框/边距
【发布时间】:2018-04-01 09:08:39
【问题描述】:

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

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

给定:

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

我不希望第一个数据点和 Y 轴之间或最后一个数据点和右边框之间有任何空白。 Y 轴的标签也不应该影响绘图的大小,所以也要考虑它的宽度。

如何完成打印每一个点?

【问题讨论】:

  • 删除空白集 plt.xlim([...])plt.ylim([...]) 以完全匹配您的数据。如果您真的想要打印每个点,您可能应该将绘图保存为矢量图形格式,然后打印得足够大。首先,我真的不明白你为什么想要这个。其次,我认为您永远无法确定,您的打印机驱动程序及其软件也可能会影响实际打印的内容。
  • 作为上述评论的替代,plt.margins(0,0) 删除自动边距
  • 我不确定margins 是否解决了这个问题(可能只是其中的一部分)。另一方面,如果您有 100000 个点,则完全不清楚“打印每个点”是什么意思。如果你有 100000 点除以 600 dpi = 166 英寸 = 4.20 米。没有纸可以测量 4 米。所以从这个意义上说,我仍然认为这个问题无法回答。
  • 评论您的 figsize:figsize 包括轴标签和所有内容,因此您设置 figsize 的方式可能不是您真正想要的。如果你有一个无限的纸打印机,你的方法可能是有道理的,但很难看到......
  • 感谢大家的意见。我收集了一些单通道轨迹,我希望它们打印得足够大,以便肉眼看到图案。是的,这是一项不寻常的任务,是的,我可以使用的打印机不受纸张长度的限制。

标签: python matplotlib plot


【解决方案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()

【讨论】:

  • 感谢您的出色回答。回到异常大量的数据点,当执行超过 70000 个点时显示此错误:ValueError: Image size of 79105x2400 pixels is too large. It must be less than 2^16 in each direction. 对此可以做些什么(除了将图形分成多个部分并重新加入另一个程序)?
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多