matrix - ejemplos - gnuplot heatmap
matriz o paleta gnuplot usando una lĂnea (1)
Básicamente, hay varias formas de lograr lo que quieres. Primero, muestro tres posibilidades para procesar los datos estáticos en un archivo .gif animado:
Use una herramienta externa (aquí
awk
) para procesar el archivo de datos una vez.(Variante de 1: utilice una herramienta externa como
awk
para procesar los datos sobre la marcha)Use solo gnuplot
Variante 1: preprocesamiento de los datos
Creo que un formato de datos apropiado para ti es
N1T1 N2T1
N3T1 N4T1
N1T2 N2T2
N3T2 N4T2
...
Tenga en cuenta las dos nuevas líneas entre los conjuntos de datos. Con esto puede usar la palabra clave index
para seleccionar diferentes conjuntos de datos.
Para preprocesar sus datos en este archivo, llame desde gnuplot
system(''if [ ! -e dataconv ]; then awk ''''{ print $1 " " $2 "/n" $3 " " $4 "/n/n"}'''' data > dataconv; fi'')
Si desea tener un rango de color fijo para todos los marcos, puede usar valores fijos (si conoce los rangos) o extraerlos del archivo de datos:
stats ''dataconv'' using 1:2
timesteps = int(STATS_records/2)
cbmin = (STATS_min_x > STATS_min_y ? STATS_min_y : STATS_min_x)
cbmax = (STATS_max_x > STATS_max_y ? STATS_max_x : STATS_max_y)
set cbrange[cbmin:cbmax]
Ahora, para trazar los datos, finalmente puede usar la matrix
y seleccionar secuencialmente todos los pasos de tiempo con index
:
set terminal gif animate delay 30
set output ''animate.gif''
unset key
set xrange[-0.5:1.5]
set yrange[-0.5:1.5]
set xtics 1
set ytics 1
do for [i=0:(timesteps-1)] {
set title sprintf(''time step % 3d'', i+1)
plot ''dataconv'' matrix index i with image
}
unset output
Aquí, muestro solo el resultado del primer paso de tiempo:
Variante 2: procesar los datos sobre la marcha
Puede usar awk
para seleccionar el paso de tiempo y reformatear los datos. Para simplificar, aquí configuré manualmente un rango de colores fijo:
reset
set cbrange[0:3]
set terminal gif animate delay 30
set output ''animate2.gif''
unset key
set xrange[-0.5:1.5]
set yrange[-0.5:1.5]
set xtics 1
set ytics 1
timesteps = int(system(''wc -l data | cut -d " " -f1''))
do for [i=0:timesteps] {
set title sprintf(''time step % 3d'', i)
plot ''< awk ''''{ if (FNR == ''.i.'') {print $1 " " $2 "/n" $3 " " $4}}'''' data'' matrix with image
}
unset output
Variante 3: solo gnuplot
Esto usa solo gnuplot y no depende de herramientas externas, pero es más tedioso porque requiere algo de manipulación con la instrucción using
. El problema es que tiene datos 1D (solo una línea), pero desea trazarlos como 2D, lo que requiere un formato de datos especial para funcionar correctamente.
Para falsificar la entrada 2D, dejo que gnuplot lea en dos líneas. Mientras procesa la primera línea, gnuplot recuerda los valores de la columna 3 y 4 y los utiliza en la segunda línea en las columnas 1 y 2. Los datos de la línea 2 se descartan. Esto tiene la pequeña desventaja de que el último paso de tiempo no se puede trazar a menos que se inserte una última línea ficticia. También la estimación del valor de color máximo y mínimo es un poco más detallado para 4 columnas:
stats ''data'' using 1:2 prefix ''A_''
stats ''data'' using 3:4 prefix ''B_''
timesteps = int(A_records)
max(x, y) = x > y ? x : y
min(x, y) = x > y ? y : x
cbmin = min(min(A_min_x, A_min_y), min(B_min_x, B_min_y))
cbmax = max(max(A_max_x, A_max_y), max(B_max_x, B_max_y))
set cbrange[cbmin:cbmax]
De nuevo, puede omitir la mayor parte de esta parte si conoce el posible rango de color.
set terminal gif animate delay 30
set output ''animate3.gif''
unset key
A0 = 0
A1 = 0
set xrange[0.5:2.5]
set yrange[0.5:2.5]
set xtics 1
set ytics 1
do for [i=0:(timesteps-2)] {
set title sprintf(''time step % 3d'', i)
plot ''data'' matrix every :::i::(i+1) /
using (A0 = ($1 == 2 && $2 == i) ? $3 : A0, /
A1 = ($1 == 3 && $2 == i) ? $3 : A1, $1+1):/
($2-i+1):/
($2 == i ? $3 : ($1 == 0 ? A0 : ($1 == 1 ? A1 : $3))) /
with image
}
unset output
Espero que haya una forma que se ajuste a tus necesidades.
Trazado en tiempo real
Una posibilidad para el tipo de trazado en tiempo real es tener un bucle en el que se traza la última línea del archivo de datos. Sin embargo, esto no es seguro contra las condiciones de carrera, si su programa no escribe líneas completas a la vez:
set cbrange[0:3]
unset key
set xrange[-0.5:1.5]
set yrange[-0.5:1.5]
set xtics 1
set ytics 1
while (1) {
set title "time ".strftime(''%T'', time(0))
plot ''< tail -1 data | awk ''''{print $1 " " $2 "/n" $3 " " $4}'''' '' matrix with image
pause 0.1
}
Para interrumpir, solo presiona Ctrl+C
..Hola a todos.
Quiero trazar el mapa de color de la matriz (mapa de calor). Sin embargo, quiero el mapa de calor de la gráfica usando los datos impresos en una línea. Lo intenté,
p for[i=5:15] ''line'' u (i%2):(i/2%10):i+1 w image
Entonces, la imagen de advertencia de la pantalla de gnuplot necesita al menos datos de 2dimension
Mi conjunto de datos es así
0.1(node 1 value at time step 1) 0.1(node 2 "") 0.3(node 3 "") 0.2(node 4 "")
0.5(node 1 value at time step 2) 1.2(node 2 "") 0.7(node 3 "") 0.2(node 4 "")
0.8(node 1 value at time step 3) 2.2(node 2 "") 0.1(node 3 "") 0.1(node 4 "")
0.1(node 1 value at time step 4) 1.2(node 2 "") 1.1(node 3 "") 0.4(node 4 "")
0.4(node 1 value at time step 5) 1.1(node 2 "") 0.7(node 3 "") 0.6(node 4 "")
0.3(node 1 value at time step 6) 0.4(node 2 "") 0.2(node 3 "") 0.3(node 4 "")
0.2(node 1 value at time step 7) 0.3(node 2 "") 0.7(node 3 "") 0.2(node 4 "")
.
.
.
.
En los datos anteriores hay 4 valores en una línea. Usando 4 valores en una línea, quiero hacer una matriz de color de 2X2 Y cada 0.3 segundos quiero cambiar de línea para hacer un cambio de color de video. Puedo hacer un video, pero el problema es: ¿cómo puedo hacer que la matriz use datos en una línea?
Y no quiero convertir en datos x: y: z para trazar la imagen. Mis datos son un poco largos y pesados. Me preocupa que pueda disminuir la velocidad. Necesito trazar un mapa de calor en tiempo real. A medida que el valor cambia, el color también cambia en tiempo real
También probé la paleta,
p for[i=5:15] ''line'' u (i%2):(i/2%10):i+1 w p pt 5 ps 23.5 palette
Sin embargo, hay espacios vacíos (color blanco) entre xaxis y yaxis.
Por lo tanto, no se ve bien.
¿Cómo puedo trazar el mapa de calor usando datos impresos en una línea?
En realidad, si puedo trazar mapas de calor en tiempo real sin guardar datos en el archivo, será mejor. (En el código C abra gnuplot y pase los valores al gnuplot)
Gracias de antemano