Hilfe für einen stacked Plot

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ThomsDay
User
Beiträge: 1
Registriert: Donnerstag 2. Juni 2022, 22:27

Hallo, ich bin am verzweifeln bei einem Plot. Wenn jemand Hilfe hätte wäre ich sehr dankbar.
Ich habe einen Bilder stack (spektroskopy) aus 41 Bilder mit je 1024x1024 Auflösung.
Ich muss diese Plotten und damit einen Zylinder darstellen, inkl. 1 Eck herausschneiden.
Soweit so gut. Es sieht nur sehr falsch aus, da ich es nicht schaffe die Ränder zu verbinden. Sprich man sieht bei jedem Slice etwas nach innen. Dies ist aber sehr schlecht.
Eiglich bräuchte ich geschlossene Ränder (also auch entlang der z-achse) und diese am bessten interpoliert.
Anbei wäre mein Code bis jetzt, nichts besonderes aber besser wirds nicht. :D

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from scipy.ndimage.filters import gaussian_filter
from scipy.interpolate import RegularGridInterpolator

data = np.genfromtxt('07_k_PE50_FoV4c6_Escan_ap1750_HIS_CuKFU.dat',
skip_header=89,
skip_footer=0,
names=True,
dtype=None,
delimiter=' ')

N=1024
Energies = []
files = []
field_of_view = []
for line in data:
str_line = str(line)[3:-2]
str_line = str_line.split(r'\t')
Energies.append(float(str_line[0]))
files.append(str_line[11][1:-1])
field_of_view.append(float(str_line[8]))

Energies = np.array(Energies)
field_of_view = np.array(field_of_view)
Binding_energie = Energies -21.2

images = np.zeros((1024,1024,len(Energies)))
for i,file in enumerate(files):
img = mpimg.imread(file)
blurred = gaussian_filter(img, sigma=3)
images[:,:,i] = img

def kreis(data,radius=50): # Kreisförmigen plot ausschneiden
N = int(len(data))
xx,yy = np.meshgrid(range(N),range(N))
Mitte = int(N/2)
dr = xx[1]-xx[0]
r = np.sqrt((xx-Mitte)**2+(yy-Mitte)**2)
data[r - dr/2>radius] = 0
#data[r==radius] = 1
data[:Mitte,Mitte:] = 0
return data

# =============================================================================
# Interpolation
# =============================================================================
points = (np.arange(N), np.arange(N), np.arange(len(Energies)))
my_interpolating_function = RegularGridInterpolator(points, images)

new_spacing = len(Energies)*1
scale_xy = 1

xyz_grid = np.meshgrid(np.linspace(0,N-1,N*scale_xy), np.linspace(0,N-1,N*scale_xy), np.linspace(0,40,new_spacing), indexing='ij')
xyz_list = np.reshape(xyz_grid, (3, -1), order='C').T
data_new = my_interpolating_function(xyz_list)
data_new = np.reshape(data_new, (N*scale_xy, N*scale_xy, new_spacing))

Energies_new = np.linspace(Energies[0],Energies[-1],new_spacing)
# =============================================================================
# plotten
# =============================================================================
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.set_zlim([min(Energies),max(Energies)])
ax.set_zlabel('E - Ef / eV')
ax.set_xlabel(r'$k_y$ / $\AA^{-1}$')
ax.set_ylabel(r'$k_x$ / $\AA^{-1}$')
plt.setp(ax, xticks=[68*scale_xy, 290*scale_xy, 512*scale_xy, 734*scale_xy, 956*scale_xy], xticklabels=[2, 1, 0, -1, -2],
yticks=[68*scale_xy, 290*scale_xy, 512*scale_xy, 734*scale_xy, 956*scale_xy], yticklabels=[-2, -1, 0, 1, 2])

Ef = np.ones([N*scale_xy,N*scale_xy])
Ef = kreis(Ef,radius=432*scale_xy)
data_masked = np.ma.masked_array(Ef, mask=(Ef==0))
xx,yy = np.meshgrid(range(N*scale_xy),range(N*scale_xy))
#ax.contourf(xx,yy,data_masked,zdir='z', offset=21.2, cmap="hot_r")

for i,ener in enumerate(Energies_new):
print('%.1f Prozent'%((i+1)/new_spacing*100))
data = kreis(data_new[:,:,i],radius=430*scale_xy)
data_masked = np.ma.masked_array(data, mask=(data==0))
#data_norm = (data_masked-np.min(data_masked))/(np.max(data_masked)-np.min(data_masked))*255
ax.contourf(xx,yy,data_masked, zdir='z', offset=ener, linewidths=5, interpolation='bicubic', extend='both', cmap="plasma")
Antworten