2017-10-20 35 views
0

J'ai des données de séries chronologiques (signal) de longueur différente que je voudrais tracer sans aucune marge entre l'échelle et le signal. Objectif: tracer chaque signal afin que l'impression (physique) du tracé montre chaque point de données. L'intrigue doit être enregistrée dans un fichier.Python/matplotlib: impression en résolution et sans espace/bordures/marges

Vu:

  1. imprimante 600 dpi résolution d'impression maximale.
  2. signaux avec un nombre différent de points de données (de 30000 à 100000).

exemple de signal:

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

Si je conspire juste avec 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

Je ne veux pas d'espace blanc entre le premier point de données et l'axe Y ou entre le dernier point de données et la bordure droite. L'étiquette de l'axe Y ne doit pas non plus interférer avec la taille de l'intrigue, donc sa largeur doit également être prise en compte.

Comment puis-je obtenir que chaque point soit imprimé?

+0

Pour enlever l'espace blanc serti 'plt.xlim ([...])' et 'plt.ylim ([...])' correspondre exactement vos données. Si vous voulez vraiment que chaque point soit imprimé, vous devez probablement sauvegarder l'intrigue dans un format vectoriel, puis imprimer suffisamment grand. D'abord, je ne vois pas vraiment pourquoi tu voudrais ça. Deuxièmement, je ne pense pas que vous pouvez être sûr, le pilote de votre imprimante et son logiciel peuvent également influencer ce qui est réellement imprimé. –

+0

Comme une alternative au commentaire ci-dessus, 'plt.margins (0,0)' pour supprimer les marges automatiques – DavidG

+0

Je ne suis pas sûr si 'margins' résout ce problème (probablement seulement une partie de celui-ci). D'un autre côté, c'est totalement flou ce que signifie "imprimer chaque point" si vous avez 100000 points. Si vous avez 100000 points divisés 600 dpi = 166 pouces = 4.20 mètres. Il n'y a pas de papier qui mesure 4 mètres. Donc, dans ce sens, je pense toujours que cette question ne répond pas. – ImportanceOfBeingErnest

Répondre

1

Je vais négliger le point de plus de 30000 points car cela n'a aucun sens pour l'impression. Donc, en supposant une configuration comme impliquée par le code de quelque 3000 points ou plus, vous pouvez calculer la taille de la figure nécessaire pour montrer l'intrigue avec un point par point imprimable. Vous devez également vous assurer que la largeur de la ligne est en fait d'un point.

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

Merci pour votre excellente réponse. Revenant sur le nombre anormalement élevé de points de données, cette erreur apparaît lors de l'exécution de plus de 70000 points: 'ValueError: la taille de l'image de 79105x2400 pixels est trop grande. Il doit être inférieur à 2^16 dans chaque direction. »Que peut-on faire à ce sujet (en plus de diviser le graphique en plusieurs parties et de le rejoindre avec un autre programme)? – user7677771

+0

En utilisant eps comme format de sortie, l'exportation fonctionne. – user7677771