2014-06-24 5 views
1

J'essaye de convertir un tracé que nous utilisons habituellement en utilisant des points sur une carte thermique. Les données sont en x, y, format z avec x, y étant latitude/longitude et z étant le nombre de cas enregistrésgnuplot - passage de 2d points à heatmap

Nous traçons actuellement en utilisant:

plot 'data.dat' u 1:2:3 with points pointtype 13 lc palette, \ 
'boundary.dat' with lines ls 1 

Je voudrais être en mesure de tracer un heatmap en 3 graphes: 1. heatmap de base des valeurs 2. points à peut-être 50% d'opacité pour montrer le géo-chemin sous-jacent 3. ligne représentant la limite.

exemple d'image: enter image description here L'image de gauche est gnuplot, celle de droite est de qgis. Nous aimerions que gnuplot produise quelque chose de similaire à celui de droite.

Peter

Répondre

1

question de Nice :)

Vous aurez besoin de quelques étapes pour obtenir un bon résultat:

Afin d'obtenir une carte de répartition, vous devez créer une grille régulière et interpoler votre Les données. Cela peut être fait avec set dgrid3d. Parce que vous voulez que l'interpolation uniquement pour certaines de vos données, vous devez écrire l'interpolation à un fichier temporaire:

set dgrid3d 200,200,2 
set table 'data-heatmap.dat' 
splot '< tr "," " " < data.dat' using 1:2:3 
unset table 
unset dgrid3d 

Habituellement, vous pouvez utiliser set datafile separator ',' utiliser des virgules comme délimiteurs, mais le fichier temporaire data-heatmap.dat' contains columns separated by spaces, so you must use tr` pour remplacer le des virgules avec des espaces blancs.

Ensuite, vous pouvez tracer tous ensemble. Un script complet pourrait se présenter comme suit:

# Diverging color palette from colorbrewer2.org 
set palette defined (0 '#006837', 1 '#1a9850', 2 '#66bd63',\ 
        3 '#a6d96a', 4 '#d9ef8b', 5 '#ffffbf',\ 
        6 '#fee08b', 7 '#fdae61', 8 '#f46d43',\ 
        9 '#df3027', 10 '#a50026') 
unset key 
set dgrid3d 200,200,2 
set table 'data-heatmap.dat' 
splot '< tr "," " " < data.dat' using 1:2:3 
unset table 
unset dgrid3d 

set autoscale fix 
set xtics 0.1 
plot 'data-heatmap.dat' u 1:2:3 w image,\ 
    '< tr "," " " < boundary.dat' w l lc rgb 'black' lw 2,\ 
    '< tr "," " " < data.dat' w p pt 7 ps 0.2 lc palette 

Pour obtenir une interpolation plus lisse, utilisez set dgrid3d 200,200,1 ou similaire. Peut-être souhaitez-vous également définir une plage de couleurs fixe avec set cbrange.

Le résultat avec 4.6.5 est:

enter image description here

Les dimensions de la grille générée est dérivée de la zone de délimitation des données éparses. Comme un hack pour étendre la région d'interpolation, vous pouvez ajouter deux points fictifs à la volée lors de la création des données interpolées: un point en haut à droite et un en haut à gauche. Plus tard, vous pouvez corriger un peu pour ces points avec set offsets:

# Diverging color palette from colorbrewer2.org 
set palette defined (0 '#006837', 1 '#1a9850', 2 '#66bd63',\ 
        3 '#a6d96a', 4 '#d9ef8b', 5 '#ffffbf',\ 
        6 '#fee08b', 7 '#fdae61', 8 '#f46d43',\ 
        9 '#df3027', 10 '#a50026') 
unset key 
set dgrid3d 200,200,2 
set table 'data-heatmap.dat' 
splot '< echo -e "\n-118.62,34.29,1\n-118.10,34.29,1" | paste -s -d "\n" data.dat - | tr "," " "' using 1:2:3 
unset table 
unset dgrid3d 

set autoscale fix 
set offsets -0.02,-0.01,-0.01,0.01 
set xtics 0.1 
plot 'data-heatmap.dat' u 1:2:3 w image,\ 
    '< tr "," " " < boundary.dat' w l lc rgb 'black' lw 2,\ 
    '< tr "," " " < data.dat' w p pt 7 ps 0.2 lc palette 

enter image description here

+0

C'est exactement ce que je cherchais. Est-il possible d'ajouter une petite quantité de rembourrage en haut et en bas pour que l'interpolation continue au nord et au sud de quelques pixels? – user438431

+0

Hmm, "oui", voir mon édition. – Christoph

+0

ok, parfait. Les données sont générées par programme, donc je peux ajouter quelques lignes/colonnes fictives si nécessaire. Je l'ai également modifié pour créer des espaces en utilisant des espaces plutôt que des virgules, donc le tr n'est pas nécessaire. Merci! – user438431

Questions connexes