Plotting 3D data in 2D map

Viewed 106

Hello I would like to display a 3D interpolation in a 1D basemap. However, I keep getting this error:

ValueError: condition must be a 1-d array

How can I convert the 3d array into a 1D array without the plot being consumed on the map. The error occurs in line: plot_mesh_data(interpolation, grid,basemap)

The Data: https://filebin.net/n9mnzakasaf6tb0g

my code:`

    from traceback import print_tb
import numpy as np
from pykrige.uk3d import UniversalKriging3D
from pykrige.kriging_tools import write_asc_grid
import pykrige.kriging_tools as kt
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Path, PathPatch
import pandas as pd

def load_data():
    df = pd.read_csv(r"File")
    return(df)

def get_data(df):
    return {
        "lons": df['Longitude'],
        "lats": df['Latitude'],
        "alts": df['Altitude'],
        "values": df['O18'],
    }

def extend_data(data):
    return {
        "lons": np.concatenate([np.array([lon-360 for lon in data["lons"]]), data["lons"], np.array([lon+360 for lon in data["lons"]])]),
        "lats": np.concatenate([data["lats"], data["lats"], data["lats"]]),
        "alts": np.concatenate([data["alts"], data["alts"], data["alts"]]),
        "values":  np.concatenate([data["values"], data["values"], data["values"]]),
    }

def generate_grid(data, basemap, delta=1):
    grid = {
        'lon': np.arange(-180, 180, delta),
        'lat': np.arange(np.amin(data["lats"]), np.amax(data["lats"]), delta), 
        'alt': np.arange(np.amin(data["alts"]), np.amax(data["alts"]), delta)
    }
    grid["x"], grid["y"], grid["z"] = np.meshgrid(grid["lon"], grid["lat"], grid["alt"], indexing="ij")
    grid["x"], grid["y"] = basemap(grid["x"], grid["y"])
    return grid

def interpolate(data, grid):
    uk3d = UniversalKriging3D(
        data["lons"],
        data["lats"],
        data["alts"],
        data["values"],
        variogram_model='exponential',
        drift_terms=["specified"],
        specified_drift=[data["alts"]],
    )
    return uk3d.execute("grid", grid["lon"], grid["lat"], grid["alt"], specified_drift_arrays=[grid["z"]])


def prepare_map_plot():
    figure, axes = plt.subplots(figsize=(10,10))
    basemap = Basemap(projection='robin', lon_0=0, lat_0=0, resolution='h',area_thresh=1000,ax=axes) 
    return figure, axes, basemap

def plot_mesh_data(interpolation, grid, basemap):
    colormesh = basemap.contourf(grid["x"], grid["y"],grid["z"],  interpolation,32, cmap='RdBu_r') 
    color_bar = basemap.colorbar(colormesh,location='bottom',pad="10%") 
df = load_data()
base_data = get_data(df)
figure, axes, basemap = prepare_map_plot()
grid = generate_grid(base_data, basemap, 90)
extended_data = extend_data(base_data)
interpolation, interpolation_error = interpolate(extended_data, grid)
plot_mesh_data(interpolation, grid,basemap)

Should I just develop a second grid which I use only for plotting the interpolated data?

0 Answers
Related