J'essaie d'utiliser gnuplot 5.0 pour tracer un tableau 2D de données sans marges, bordures ou axes ... juste une image 2D (.png ou .jpg) représentant certaines données. Je souhaite avoir chaque élément de réseau pour correspondre exactement à un pixel de l'image avec aucune mise à l' échelle / interpolation , etc et pas de pixels blancs supplémentaires sur les bords.
Jusqu'à présent, lorsque j'essaie de définir les marges à 0 et même en utilisant le pixels
drapeau, je reste avec une rangée de pixels blancs sur les bordures droite et supérieure de l'image.
Comment puis-je obtenir juste un fichier image avec une représentation pixel par pixel d'un tableau de données et rien de plus?
script gnuplot:
#!/usr/bin/gnuplot --persist
set terminal png size 400, 200
set size ratio -1
set lmargin at screen 0
set rmargin at screen 1
set tmargin at screen 0
set bmargin at screen 1
unset colorbox
unset tics
unset xtics
unset ytics
unset border
unset key
set output "pic.png"
plot "T.dat" binary array=400x200 format="%f" with image pixels notitle
Exemple de données de Fortran 90:
program main
implicit none
integer, parameter :: nx = 400
integer, parameter :: ny = 200
real, dimension (:,:), allocatable :: T
allocate (T(nx,ny))
T(:,:)=0.500
T(2,2)=5.
T(nx-1,ny-1)=5.
T(2,ny-1)=5.
T(nx-1,2)=5.
open(3, file="T.dat", access="stream")
write(3) T(:,:)
close(3)
end program main
x y z
liste?Réponses:
Certains terminaux gnuplot implémentent "avec image" en créant un fichier png séparé contenant l'image, puis en y liant à l'intérieur du tracé résultant. L'utilisation directe de ce fichier image png séparé évitera tout problème de mise en page, de marges, etc. Ici, j'utilise le terminal canvas. L'intrigue elle-même est jetée; nous ne conservons que le fichier png créé avec le contenu souhaité.
la source
set term tikz externalimages
et ce terminal réinitialise le compteur à chaque "terme défini". Vous ne pouvez pas l'utiliserset output "/dev/null"
avec tikz, mais si cela ne fonctionne pas pour supprimer la sortie pour vous, alors vous ne vous en souciez peut-être pas. Les terminaux tkcanvas et svg sont d'autres possibilités, mais le mécanisme externe de png dépend de la version de gnuplot et des options de compilation.N'utilisez pas gnuplot.
Au lieu de cela, écrivez un script qui lit vos données et les convertit en l'un des formats Portable Anymap . Voici un exemple en Python:
Si vous pouvez modifier le programme qui génère le fichier de données, vous pouvez même ignorer l'étape ci-dessus et générer à la place les données directement au format PNM.
Dans les deux cas, vous pouvez ensuite utiliser ImageMagick pour convertir l'image au format de votre choix:
la source
imwrite
fonction peut être utilisée pour enregistrer des données 2D en tant qu'image PNG.gnuplot
, je vais simplement l'utiliser à lamatplotlib
place (voir ma réponse ci-dessous). C'est une grande contribution, mais techniquement la question / prime demande unegnuplot
solution, aussi impropre qu'elle semble être pour cette tâche particulière.Cela devrait être une tâche facile, mais ce n'est apparemment pas le cas. Ce qui suit peut être une solution (lourde) car toutes les autres tentatives ont échoué. Je soupçonne que certaines bibliothèques graphiques ont un problème que vous ne pouvez probablement pas résoudre en tant qu'utilisateur gnuplot.
Vous avez mentionné que les données de matrice ASCII sont également correctes. Le "truc" ici est de tracer des données
with lines
où les données sont "interrompues" par des lignes vides, dessinant essentiellement des points uniques. Vérifiez ceci au cas où vous auriez besoin de placer votre fichier de données 1: 1 dans un bloc de données .Cependant, s'il n'est pas déjà assez étrange, il semble fonctionner pour
png
etgif
terminal mais pas pourpngcairo
ouwxt
. Je suppose que la solution de contournement est probablement lente et inefficace, mais au moins elle crée la sortie souhaitée. Je ne sais pas s'il y a une limite de taille. Testé avec 100x100 pixels avec Win7, gnuplot 5.2.6. Les commentaires et améliorations sont les bienvenus.Code:
Résultat: (100x100 pixels)
(agrandi avec un fond noir):
Image avec 400x200 pixels (prend environ 22 secondes sur mon ordinateur portable de 8 ans).
la source
x
ety
. Cela fonctionne toujours siSizeX
etSizeY
ne sont pas égaux. Je vais corriger le code.Data2
?Ce que j'ai finalement utilisé pour obtenir ce dont j'avais besoin, même si la question / prime demande une
gnuplot
solution:matplotlib
a une fonction matplotlib.pyplot.imsave qui fait ce que je cherchais ... c'est-à-dire tracer "juste des pixels de données" et pas d'extras comme des bordures, des marges, des axes, etc. À l'origine, je ne connaissais que matplotlib.pyplot.imshow et je devais tirer de nombreuses astuces pour éliminer tous les extras du fichier image et empêcher toute interpolation / lissage, etc. (et donc tourné versgnuplot
à un certain point). Avecimsave
c'est assez facile, je suis donc de retour à utilisermatplotlib
pour une solution simple mais toujours flexible (en termes de palette de couleurs, de mise à l'échelle, etc.) pour les tracés 'pixel exact'. Voici un exemple:la source
OK, voici une autre solution possible (je l'ai séparée de ma première approche lourde). Il crée l'intrigue immédiatement, moins d'une seconde. Aucun renommage nécessaire ni création d'un fichier inutile.
Je suppose que la clé est d'utiliser
term png
etps 0.1
.Je n'ai pas de preuve mais je pense que ce
ps 1
serait ca. 6 pixels de large et créerait un chevauchement et / ou des pixels blancs au coin. Encore une fois, pour une raison quelconque, il semble fonctionner avecterm png
mais pas avecterm pngcairo
.Ce que j'ai testé (Win7, gnuplot 5.2.6) est un fichier binaire ayant le motif
00 00 FF
répété partout (je ne peux pas afficher ici d'octets nuls). Étant donné que gnuplot lit apparemment 4 octets par élément de tableau (format="%d"
), cela conduit à un motif RVB alternatif si je tracewith lc rgb var
.De la même manière (espérons-le), nous pouvons comprendre comment le lire
format="%f"
et l'utiliser avec une palette de couleurs. Je suppose que c'est ce que vous cherchez, non? D'autres résultats de test, commentaires, améliorations et explications sont les bienvenus.Code:
Résultat:
la source