2017-10-20 40 views
0

私はスケールと信号の間に余白を入れずにプロットしたい異なる長さの時系列データ(信号)を持っています。Python/matplotlib:解像度と空白/枠/余白なしで印刷

目標:各信号をプロットすると、プロットの(物理的な)印刷にすべてのデータポイントが表示されます。プロットはファイルに保存されます。

考える:600dpiの最大印刷解像度と

  1. プリンタ。
  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軸のラベルも、プロットのサイズに影響しないようにする必要があります。その幅も考慮する必要があります。

1点ごとに印刷するにはどうすればよいですか?

+0

'plt.xlim([...])'と 'plt.ylim([...])'正確にあなたのデータと一致するように設定されたホワイトスペースを削除します。すべての点を実際に印刷したい場合は、プロットをベクトルグラフィックス形式で保存してから、十分に印刷してください。まず、なぜあなたがこれを望んでいるのか本当に分かりません。第二に、私はあなたがあなたのプリンタのドライバとそのソフトウェアが実際に印刷されるものに影響するかもしれないと確信できるとは思わない。 –

+0

上記のコメントの代わりに、自動余白を削除するための 'plt.margins(0,0)' – DavidG

+0

'marginins'がこの問題(おそらくその一部のみ)を解決するかどうかはわかりません。一方、「1点1点印刷」とは、あなたが100000点を持っていることを意味します。 100000ポイントを600dpi = 166インチ= 4.20メートルに分けた場合4メートルを測定する紙はありません。そういう意味で私はまだこの質問に答えることはできないと思います。 – ImportanceOfBeingErnest

答えて

1

これは印刷にナンセンスなので、30000点を超える点は無視します。したがって、3000ポイント程度のコードで暗示されている設定を仮定すると、印刷可能ポイントごとに1ポイントでプロットを表示するのに必要なFigureのサイズを計算できます。また、線幅が実際には1ドット幅であることを確認する必要があります。

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

関連する問題