График 4D данных в виде слоистых тепловых карт в Python - PullRequest
0 голосов
/ 07 января 2019

Я хотел бы создать многослойные тепловые карты, используя координаты (x, y, z) и четвертое измерение, основанное на цвете, для корреляции с интенсивностью.

Все данные, относящиеся к слою, содержатся в текстовом файле со столбцами x, y, z и G. Разделителем является пробел. Извиняюсь, если это не правильно.

XA 200 600 1200 1800 2400 3000 200 600 1200 1800 2400 3000

Ю.А. 0 0 0 0 0 0 600 600 600 600 600 600

ZA 600 600 600 600 600 600 600 600 600 600 600 600

GA 1,27 1,54 1,49 1,34 1,27 1,25 1,28 1,96 1,12 1,06 1,06 1,06

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

data = np.load(filename)

x = np.linspace(0,2400,num=6)
y = np.linspace(0,2400,num=11)
X,Y=np.meshgrid(x,y)
Z = data[:,:,0] * 1e-3

plt.contourf(X,Y,Z)
plt.colorbar()

Как читать текстовые файлы, создавать и накладывать тепловые карты вдоль оси Z?

1 Ответ

0 голосов
/ 07 января 2019

Допустим, у вас есть два txt-файла, а именно data-z600.txt и data-z1200.txt , в той же папке, что и скрипт Python, содержимое которого точно равно

data-z600.txt (ваш)

XA YA ZA GA
200 0 600 1.27
600 0 600 1.54
1200 0 600 1.49
1800 0 600 1.34
2400 0 600 1.27
3000 0 600 1.25
200 600 600 1.28
600 600 600 1.96
1200 600 600 1.12
1800 600 600 1.06
2400 600 600 1.06
3000 600 600 1.06

и data-z1200.txt (изобретено специально)

XA YA ZA GA
200 0 1200 1.31
600 0 1200 2
1200 0 1200 1.63
1800 0 1200 1.36
2400 0 1200 1.31
3000 0 1200 1.35
200 600 1200 1.38
600 600 1200 1.36
1200 600 1200 1.2
1800 600 1200 1.1
2400 600 1200 1.1
3000 600 1200 1.11

Давайте импортируем все необходимые библиотеки

# libraries
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import scipy.interpolate as si
from matplotlib import cm
import pandas as pd
import numpy as np

и определим grids_maker, функцию, которая выполняет работу по подготовке данных, содержащихся в данном файле, здесь нацеленную через аргумент filepath.

def grids_maker(filepath):
    # Get the data
    df = pd.read_csv(filepath, sep=' ')

    # Make things more legible
    xy = df[['XA', 'YA']]
    x  = xy.XA
    y  = xy.YA
    z  = df.ZA
    g  = df.GA
    reso_x = reso_y = 50
    interp = 'cubic' # or 'nearest' or 'linear'

    # Convert the 4d-space's dimensions into grids
    grid_x, grid_y = np.mgrid[
        x.min():x.max():1j*reso_x,
        y.min():y.max():1j*reso_y
    ]

    grid_z = si.griddata(
        xy, z.values,
        (grid_x, grid_y),
        method=interp
    )

    grid_g = si.griddata(
        xy, g.values,
        (grid_x, grid_y),
        method=interp
    )

    return {
        'x' : grid_x,
        'y' : grid_y,
        'z' : grid_z,
        'g' : grid_g,
    }

Давайте используем grids_maker над нашим списком файлов и получим экстремумы 4-го измерения каждого файла.

# Let's retrieve all files' contents
fgrids = dict.fromkeys([
    'data-z600.txt',
    'data-z1200.txt'
])
g_mins = []
g_maxs = []

for fpath in fgrids.keys():
    fgrids[fpath] = grids = grids_maker(fpath)
    g_mins.append(grids['g'].min())
    g_maxs.append(grids['g'].max())

Давайте создадим нашу (объединяющую все файлы) цветовую шкалу

# Create the 4th color-rendered dimension
scam = plt.cm.ScalarMappable(
    norm=cm.colors.Normalize(min(g_mins), max(g_maxs)),
    cmap='jet' # see https://matplotlib.org/examples/color/colormaps_reference.html
)

... и, наконец, сделать / показать сюжет

# Make the plot
fig = plt.figure()
ax  = fig.gca(projection='3d')
for grids in fgrids.values(): 
    scam.set_array([])   
    ax.plot_surface(
        grids['x'], grids['y'], grids['z'],
        facecolors  = scam.to_rgba(grids['g']),
        antialiased = True,
        rstride=1, cstride=1, alpha=None
    )
plt.show()

enter image description here

...