crear heatmap2d desde el archivo txt

Tengo conjunto de datos 2d (30K) como archivo txt.

XY 2.50 135.89 2.50 135.06 2.50 110.85 2.50 140.92 2.50 157.53 2.50 114.61 2.50 119.53 2.50 154.14 2.50 136.48 2.51 176.85 2.51 147.19 2.51 115.59 2.51 144.57 2.51 148.34 2.51 136.73 2.51 118.89 2.51 145.73 2.51 131.43 2.51 118.17 2.51 149.68 2.51 132.33 

Graficé como un gráfico de dispersión con gnuplot pero me gustaría representar como una distribución de densidad o mapa de calor. Miré a través de los ejemplos en MatPlotLib o R y todos parecen comenzar con datos aleatorios para generar la imagen.

Probé esos códigos y obtengo un error como este

hist, edges = histogramdd ([x, y], intervalos, rango, normado, pesos)

AttributeError: La dimensión de los contenedores debe ser igual a la dimensión de la muestra x. Script terminado.

¿Hay algún método para abrir el archivo txt y trazar estos datos en gnuplot, matplotlib? mi ttwig de dispersión se parece a esto introduzca la descripción de la imagen aquí

Quiero mostrar esta imagen como mapa de contorno o mapa de densidad con barra de código de color. mi eje x en el rango de 2.5-3.5 y el eje y en el rango de 110-180 tengo 30k puntos de datos

Si está dispuesto a hacer todo en Python, puede calcular el histogtwig y construir un diagtwig de contorno en un script:

 import numpy as np import matplotlib.pyplot as plt # load the data M = np.loadtxt('datafile.dat', skiprows=1) # compute 2d histogram bins_x = 100 bins_y = 100 H, xedges, yedges = np.histogram2d(M[:,0], M[:,1], [bins_x, bins_y]) # xedges and yedges are each length 101 -- here we average # the left and right edges of each bin X, Y = np.meshgrid((xedges[1:] + xedges[:-1]) / 2, (yedges[1:] + yedges[:-1]) / 2) # make the plot, using a "jet" colormap for colors plt.contourf(X, Y, H, cmap='jet') plt.show() # or plt.savefig('contours.pdf') 

Acabo de hacer algunos datos de prueba compuestos por 2 gaussianos y obtuve este resultado:

gráfico de contorno de histograma 2d

Aquí es cómo podría hacerlo con el preprocesamiento de Python y el trazado con gnuplot.

Variante 1

La primera variante funciona con el estilo de trazado pm3d de gnuplot. Esto permite una interpolación agradable de los datos del histogtwig, para que la imagen se vea más suave. Pero puede dar problemas para grandes conjuntos de datos, también dependiendo del formato de imagen de salida (ver Variante 2).

El script process.py Python usa numpy.histogram2d para generar el histogtwig, la salida se guarda como el formato de nonuniform matrix de gnuplot.

 # process.py from __future__ import print_function import numpy as np import sys M = np.loadtxt('datafile.dat', skiprows=1) bins_x = 100 bins_y = 100 H, xedges, yedges = np.histogram2d(M[:,0], M[:,1], [bins_x, bins_y]) # output as 'nonuniform matrix' format, see gnuplot doc. print(bins_x, end=' ') np.savetxt(sys.stdout, xedges, newline=' ') print() for i in range(0, bins_y): print(yedges[i], end=' ') np.savetxt(sys.stdout, H[:,i], newline=' ') print(H[-1,i]) # print the last line twice, then 'pm3d corners2color' works correctly print(yedges[-1], end=' ') np.savetxt(sys.stdout, H[:,-1], newline=' ') print(H[-1,-1]) 

Para trazar, simplemente ejecute el siguiente script gnuplot:

 reset set terminal pngcairo set output 'test.png' set autoscale xfix set autoscale yfix set xtics out set ytics out set pm3d map interpolate 2,2 corners2color c1 splot '< python process.py' nonuniform matrix t '' 

Variante 2

La segunda variante funciona con el estilo de trazado de image , que puede ser adecuado para grandes conjuntos de datos (tamaño de histogtwig grande), pero no se ve bien, por ejemplo, para matriz de 100x100 :

 # process2.py from __future__ import print_function import numpy as np import sys M = np.loadtxt('datafile.dat', skiprows=1) bins_x = 100 bins_y = 200 H, xedges, yedges = np.histogram2d(M[:,0], M[:,1], [bins_x, bins_y]) # remap xedges and yedges to contain the bin center coordinates xedges = xedges[:-1] + 0.5*(xedges[1] - xedges[0]) yedges = yedges[:-1] + 0.5*(yedges[1] - yedges[0]) # output as 'nonuniform matrix' format, see gnuplot doc. print(bins_x, end=' ') np.savetxt(sys.stdout, xedges, newline=' ') print() for i in range(0, bins_y): print(yedges[i], end=' ') np.savetxt(sys.stdout, H[:,i], newline=' ') print() 

Para trazar, simplemente ejecute el siguiente script gnuplot:

 reset set terminal pngcairo set output 'test2.png' set autoscale xfix set autoscale yfix set xtics out set ytics out plot '< python process2.py' nonuniform matrix with image t '' 

Puede haber algunas partes para mejorar (especialmente en el script de Python), pero debería funcionar. No publico una imagen de resultado, porque se ve fea con los pocos puntos de datos que mostró ;) .