example ejemplos matrix gnuplot palette

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:

  1. Use una herramienta externa (aquí awk ) para procesar el archivo de datos una vez.

  2. (Variante de 1: utilice una herramienta externa como awk para procesar los datos sobre la marcha)

  3. 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