Ejemplo n.º 1
0
def xyplot(x, y, title="", where=None):
    #Setting the cartesian view
    projection = macro.mmap(
        subpage_map_projection='cartesian',
        subpage_x_automatic='on',
        subpage_y_automatic='on',
    )
    #Vertical axis
    vertical = macro.maxis(axis_orientation="vertical",
                           axis_grid="on",
                           axis_grid_colour="grey",
                           axis_grid_thickness=1,
                           axis_grid_line_style="dot")

    #Horizontal axis
    horizontal = macro.maxis(axis_orientation="horizontal",
                             axis_grid="on",
                             axis_grid_colour="grey",
                             axis_grid_thickness=1,
                             axis_grid_line_style="dot")
    x[0] = x[0] * 1.
    input = macro.minput(input_x_values=x, input_y_values=y)
    graph = macro.mgraph(graph_line_colour="navy", graph_line_thickness=2)

    input = macro.minput(input_x_values=x, input_y_values=y)
    text = macro.mtext(text_lines=[title])
    if where:
        where.clear_output()
        with where:
            display(
                macro.plot(projection, vertical, horizontal, input, graph,
                           text))
    else:
        return macro.plot(projection, vertical, horizontal, input, graph, text)
Ejemplo n.º 2
0
def minput_2d(data, lon, lat, metadata, map_region=None):
    """
    Put the data into magics minput function.
    minput is used 2 define matrices as input for contouring or
    list of values as input of curve or symbol plotting.

    Args:
        data (np.float64): 2D array, [nlat, nlon]
        lon (np.float64): 1D vector, [nlon]
        lat (np.float64): 1D vector, [nlat]
        metadata (dictionary): variable name and units information, 
            like {'units': 'K', 'long_name': '2 metre temperature'}. Defaults to None.
        map_region (list, optional): if set, the data will fit to the map_region. 
                                     [lonmin, lonmax, latmin, latmax]
    """

    lat = np.squeeze(lat.astype(np.float64))
    lon = np.squeeze(lon.astype(np.float64))
    input_field_values = np.squeeze(data.astype(np.float64))

    if map_region is not None:
        loni, lonj, lati, latj = grid_subset(lon, lat, map_region)
        lon = lon[loni:lonj]
        lat = lat[lati:latj]
        input_field_values = input_field_values[lati:latj, loni:lonj]

    # put values into magics
    return magics.minput(input_type="geographical",
                         input_field=input_field_values,
                         input_latitudes_list=lat,
                         input_longitudes_list=lon,
                         input_metadata=metadata)
Ejemplo n.º 3
0
def minput_xarray_vector(uwind,
                         vwind,
                         u_varname='data',
                         v_varname='data',
                         skip=1,
                         metadata={
                             'units': 'm/s',
                             'long_name': 'Wind field'
                         }):
    """
  Put u and v xarray grid into magics minput data.
  refer to: https://github.com/ecmwf/magics-python/blob/master/Magics/macro.py
            https://confluence.ecmwf.int/display/MAGP/Input+Data
  
  Args:
      uwind (object): u wind xarray dataset which retrieve 
                      from micaps cassandra server directory.
      vwind (object): v wind xarray dataset which retrieve 
                      from micaps cassandra server directory.
      skip (int, optional): grid skip point number. Defaults to 1.
      metadata(dict, optional): data meta information. Defaults to {'units': 'm/s', 'long_name': 'Wind field'}.
  """

    # flatten an nD matrix into a 2d matrix
    for dim in uwind.dims:
        if dim in ['lon', 'lat']:
            continue
        else:
            d = uwind[dim].values[0]
            uwind = uwind.loc[{dim: d}]
            d = vwind[dim].values[0]
            vwind = vwind.loc[{dim: d}]

    # extract values
    lat = uwind['lat'].values.astype(np.float64)  # 1D vector
    lon = uwind['lon'].values.astype(np.float64)  # 1D vector
    uwind_field = np.squeeze(uwind['u_varname'].values.astype(
        np.float64))  # 2D array, [nlat, nlon]
    vwind_field = np.squeeze(vwind['v_varname'].values.astype(
        np.float64))  # 2D array, [nlat, nlon]
    lon, lat = np.meshgrid(lon, lat)

    # skip values and flatten
    uwind_field = uwind_field[::skip, ::skip].flatten()
    vwind_field = vwind_field[::skip, ::skip].flatten()
    lat = lat[::skip, ::skip].flatten()
    lon = lon[::skip, ::skip].flatten()

    # put into magics minput function
    return magics.minput(input_type="geographical",
                         input_x_component_values=uwind_field,
                         input_y_component_values=vwind_field,
                         input_latitude_values=lat,
                         input_longitude_values=lon,
                         input_metadata=metadata)
Ejemplo n.º 4
0
def minput_2d_vector(udata, vdata, lon, lat, skip=1, metadata=None):
    """
    Put the data into magics minput function.
    minput is used 2 define matrices as input for contouring or
    list of values as input of curve or symbol plotting.

    Args:
        udata (np.array): 2D array, [nlat, nlon]
        vdata (np.array): 2D array, [nlat, nlon]
        lon (np.array): 1D vector, [nlon]
        lat (np.array): 1D vector, [nlat]
        skip (int, optional): grid skip point number. Defaults to 1.
        metadata (dictionary): variable name and units information, 
            like {'units': 'm/s', 'long_name': 'wind field'}. Defaults to None.
    """

    # extract values
    lat = np.squeeze(lat.astype(np.float64))  # 1D vector
    lon = np.squeeze(lon.astype(np.float64))  # 1D vector
    uwind_field = np.squeeze(udata.astype(
        np.float64))  # 2D array, [nlat, nlon]
    vwind_field = np.squeeze(vdata.astype(
        np.float64))  # 2D array, [nlat, nlon]
    lon, lat = np.meshgrid(lon, lat)

    # skip values and flatten
    uwind_field = uwind_field[::skip, ::skip].flatten()
    vwind_field = vwind_field[::skip, ::skip].flatten()
    lat = lat[::skip, ::skip].flatten()
    lon = lon[::skip, ::skip].flatten()

    # remove nan values
    index = (~np.isnan(uwind_field)) & (~np.isnan(vwind_field))
    uwind_field = uwind_field[index]
    vwind_field = vwind_field[index]
    if uwind_field.size == 0:
        return None
    lat = lat[index]
    lon = lon[index]

    # check meta information
    if metadata is None:
        metadata = {'units': 'm/s', 'long_name': 'wind field'}

    # put into magics minput function
    return magics.minput(input_type="geographical",
                         input_x_component_values=uwind_field,
                         input_y_component_values=vwind_field,
                         input_latitude_values=lat,
                         input_longitude_values=lon,
                         input_metadata=metadata)
Ejemplo n.º 5
0
def minput_xarray(data, varname='data', metadata=None):
    """
  Put xarray grid into magics minput data.
  refer to: https://github.com/ecmwf/magics-python/blob/master/Magics/macro.py
            https://confluence.ecmwf.int/display/MAGP/Input+Data
  
  Args:
      data (object): xarray dataset which retrieve 
                     from micaps cassandra server directory.
      vwind (object): xarray dataset which retrieve 
                      from micaps cassandra server directory.
                      if set, data is uwind.
      metadata(dict, optional): data meta information. Defaults to {'units': 'm/s', 'long_name': 'Wind field'}.
  Examples:
      from nmc_met_io.retrieve_micaps_server import get_model_grid
      dataset = get_model_grid("ECMWF_HR/TMP/850", varattrs={'units':'C', 'long_name':'temperature'})
      data = minput_grid(dataset)
  """

    # flatten an nD matrix into a 2d matrix
    for dim in data.dims:
        if dim in ['lon', 'lat']:
            continue
        else:
            d = data[dim].values[0]
            data = data.loc[{dim: d}]

    # extract values
    lat = data['lat'].values.astype(np.float64)  # 1D vector
    lon = data['lon'].values.astype(np.float64)  # 1D vector
    input_field_values = np.squeeze(data[varname].values.astype(
        np.float64))  # 2D array, [nlat, nlon]

    # set data meta data
    if metadata is None:
        metadata = dict(data[varname].attrs)

    # put values into magics
    return magics.minput(input_field=input_field_values,
                         input_latitudes_list=lat,
                         input_longitudes_list=lon,
                         input_metadata=metadata)
Ejemplo n.º 6
0
def minput_grid(directory, **kwargs):
    """
  Retrieve model grid data from micaps cassandra server and
  put xarray into magics minput data.
  refer to: https://github.com/ecmwf/magics-python/blob/master/Magics/macro.py
  
  Args:
      directory (string): micaps cassandra server directory.
  Examples:
      data = minput_grid("ECMWF_HR/TMP/850", varattrs={'units':'C', 'long_name':'temperature'})
  """

    # retrieve data
    data = get_model_grid(directory, **kwargs)
    if data is None:
        return None

    # flatten an nD matrix into a 2d matrix
    for dim in data.dims:
        if dim in ['lon', 'lat']:
            continue
        else:
            d = data[dim].values[0]
            data = data.loc[{dim: d}]

    # extract values
    lat = data['lat'].values.astype(np.float64)
    lon = data['lon'].values.astype(np.float64)
    input_field_values = np.squeeze(data['data'].values.astype(np.float64))

    # put values into magics
    data = magics.minput(input_field=input_field_values,
                         input_latitudes_list=lat,
                         input_longitudes_list=lon,
                         input_metadata=dict(data['data'].attrs))
    return data
Ejemplo n.º 7
0
def minput_2d(data, lon, lat, metadata):
    """
    Put the data into magics minput function.
    minput is used 2 define matrices as input for contouring or
    list of values as input of curve or symbol plotting.

    Args:
        data (np.float64): 2D array, [nlat, nlon]
        lon (np.float64): 1D vector, [nlon]
        lat (np.float64): 1D vector, [nlat]
        metadata (dictionary): variable name and units information, 
            like {'units': 'K', 'long_name': '2 metre temperature'}. Defaults to None.
    """

    lat = np.squeeze(lat.astype(np.float64))
    lon = np.squeeze(lon.astype(np.float64))
    input_field_values = np.squeeze(data.astype(np.float64))

    # put values into magics
    return magics.minput(input_type="geographical",
                         input_field=input_field_values,
                         input_latitudes_list=lat,
                         input_longitudes_list=lon,
                         input_metadata=metadata)
Ejemplo n.º 8
0
def as_plottable(field, position=0, metadata=None, preproc=None):

    # print('as_plottable', preproc)

    if isinstance(field, str):
        grib = macro.mgrib(grib_input_file_name=field,
                           grib_file_address_mode='byte_offset',
                           grib_field_position=position)
        return grib, None, metadata, 'path'

    if hasattr(field, 'path') and hasattr(field, 'offset') and hasattr(
            field, 'area'):
        grib = macro.mgrib(grib_input_file_name=field.path,
                           grib_file_address_mode='byte_offset',
                           grib_field_position=int(field.offset))
        return grib, field.area, metadata, 'gridfield'

    if isinstance(field, xr.DataArray):
        if metadata is None:
            metadata = {}
            grib = {}
            for k, v in field.attrs.items():
                if k.startswith('GRIB_'):
                    grib[k[5:]] = str(v)
                else:
                    metadata[k] = str(v)

            # Only key GRIB
            if grib:
                metadata = grib

        n, w, s, e = float(field.latitude[0]), float(
            field.longitude[0]), float(field.latitude[-1]), float(
                field.longitude[-1])
        ns = float(field.latitude[1]) - float(field.latitude[0])
        ew = float(field.longitude[1]) - float(field.longitude[0])

        grib = macro.minput(
            input_field=field.values,
            input_field_initial_latitude=n,
            input_field_latitude_step=ns,
            input_field_initial_longitude=w,
            input_field_longitude_step=ew,
            input_metadata=metadata,
        )
        return grib, (n, w, s, e), metadata, 'xarray'

    if hasattr(field, 'array'):
        ew, ns = field.grid
        n, w, s, e = field.area
        if metadata is None:
            metadata = field.metadata

        if preproc:
            f = preproc
        else:
            f = identity

        grib = macro.minput(
            input_field=f(field.array),
            input_field_initial_latitude=float(n),
            input_field_latitude_step=-float(ns),
            input_field_initial_longitude=float(w),
            input_field_longitude_step=float(ew),
            input_metadata=metadata,
        )
        return grib, (n, w, s, e), metadata, 'bespoke'

    if isinstance(field, np.ndarray):

        class F:
            def __init__(self, f):
                self.array = f
                self.grid = metadata['grid']
                self.area = metadata['area']

        return as_plottable(F(field), metadata=metadata, preproc=preproc)

    if isinstance(field, list):
        if isinstance(position, list):
            return [
                as_plottable(f, p, metadata)
                for (f, p) in zip(field, position)
            ]
        else:
            return [as_plottable(f, 0, metadata) for f in field]

    raise ValueError("Cannot plot %s" % (type(field), ))
Ejemplo n.º 9
0
def plot_to_file(field,
                 file,
                 size=10.,
                 projection=None,
                 contour=None,
                 grid=True,
                 title=True,
                 title_text='Title',
                 width=400,
                 ratio=1.0,
                 area=None,
                 metadata=None,
                 text_format='(automatic)',
                 position=0,
                 format=None,
                 preproc=None,
                 legend=False,
                 boxes=[]):

    plottable = as_plottable(field, position, metadata, preproc)
    if isinstance(plottable, list):
        _, in_file_area, metadata, what = plottable[0]
        grib = [g[0] for g in plottable]
    else:
        grib, in_file_area, metadata, what = plottable

    # print("XXXX PLOT", what, "metadata =>", metadata,
    #       "contour => ", contour,
    #       "area =>", area)

    if projection is None:
        if area is None:
            area = in_file_area

        if area:
            n, w, s, e = area
            projection = macro.mmap(subpage_upper_right_longitude=float(e),
                                    subpage_upper_right_latitude=float(n),
                                    subpage_lower_left_latitude=float(s),
                                    subpage_lower_left_longitude=float(w),
                                    subpage_map_projection='cylindrical')
        else:
            projection = macro.mmap(subpage_map_projection='cylindrical')

    if isinstance(projection, str):
        projection = PROJECTIONS[projection]

    contour = make_contour(contour, legend)

    if isinstance(grib, list) and not isinstance(contour, list):
        contour = [contour] * len(grib)

    base, ext = os.path.splitext(file)
    if format is None:
        format = ext[1:]
    output = macro.output(output_formats=[format],
                          output_name_first_page_number='off',
                          page_x_length=float(size),
                          page_y_length=float(size) * ratio,
                          super_page_x_length=float(size),
                          super_page_y_length=float(size) * ratio,
                          subpage_x_length=float(size),
                          subpage_y_length=float(size) * ratio,
                          subpage_x_position=0.,
                          subpage_y_position=0.,
                          output_width=width,
                          page_frame='on',
                          page_id_line='off',
                          output_name=base)

    foreground = macro.mcoast(map_grid=ONOFF[grid], map_label='off')

    background = macro.mcoast(map_grid=ONOFF[grid],
                              map_grid_colour='tan',
                              map_label='off',
                              map_coastline_land_shade='on',
                              map_coastline_land_shade_colour='cream',
                              map_coastline_colour='tan')
    data = []
    data.append(background)

    if isinstance(grib, list):
        for g, c in zip(grib, contour):
            data.append(g)
            data.append(c)
    else:
        data.append(grib)
        data.append(contour)

    data.append(foreground)

    bb = float(len(boxes) + 1)
    for i, b in enumerate(boxes):
        inc = 0.1
        n, w, s, e = b
        a = np.ones(((e - w + inc) / inc - 2, ((n - s + inc) / inc) - 2))
        a = np.pad(a, 1, 'constant', constant_values=0)

        b = macro.minput(input_field=a,
                         input_field_initial_latitude=float(n),
                         input_field_latitude_step=-float(inc),
                         input_field_initial_longitude=float(w),
                         input_field_longitude_step=float(inc),
                         input_metadata={})
        data.append(b)
        # print a.shape

        d = "rgba(1,0,0,%g)" % (i / bb)

        c = macro.mcont(
            contour="off",
            contour_shade="on",
            contour_shade_method="area_fill",
            contour_shade_max_level_colour=d,
            contour_shade_min_level_colour=d,
        )

        data.append(c)

    if title:
        data.append(macro.mtext())

    if legend:
        width = 1000
        height = 200
        width_cm = float(width) / 40.
        height_cm = float(height) / 40.
        output = macro.output(
            output_formats=[format],
            output_name_first_page_number='off',
            # output_cairo_transparent_background='on',
            output_width=width,
            super_page_x_length=width_cm,
            super_page_y_length=height_cm,
            output_name=base,
            subpage_frame=False,
            page_frame=False,
            page_id_line=False)

        leg = macro.mlegend(legend_title="on",
                            legend_title_font_size=1.1,
                            legend_display_type="continuous",
                            legend_title_text=title_text,
                            legend_text_colour="charcoal",
                            legend_box_mode="positional",
                            legend_text_format=text_format,
                            legend_box_x_position=0.00,
                            legend_box_y_position=0.00,
                            legend_box_x_length=width_cm,
                            legend_box_y_length=height_cm,
                            legend_box_blanking="on",
                            legend_text_font_size="15%",
                            legend_border=False,
                            legend_border_colour="rgb(0.18,0.18,0.62)")

        with LOCK:
            # print(output, data[1], data[2], leg)
            macro.plot(output, data[1], data[2], leg)
        return

    data.append(macro.page())

    # print(output, projection, data)

    with LOCK:
        macro.plot(output, projection, data)
Ejemplo n.º 10
0
def minput_2d_vector(udata,
                     vdata,
                     lon,
                     lat,
                     skip=1,
                     metadata=None,
                     map_region=None):
    """
    Put the data into magics minput function.
    minput is used 2 define matrices as input for contouring or
    list of values as input of curve or symbol plotting.

    Args:
        udata (np.array): 2D array, [nlat, nlon]
        vdata (np.array): 2D array, [nlat, nlon]
        lon (np.array): 1D vector, [nlon]
        lat (np.array): 1D vector, [nlat]
        skip (int, optional): grid skip point number. Defaults to 1.
        metadata (dictionary): variable name and units information, 
            like {'units': 'm/s', 'long_name': 'wind field'}. Defaults to None.
        map_region (list, optional): if set, the data will fit to the map_region. 
                                     [lonmin, lonmax, latmin, latmax]
    """

    # check data
    if udata is None or vdata is None:
        return None

    # extract values
    lat = np.squeeze(lat.astype(np.float64))  # 1D vector
    lon = np.squeeze(lon.astype(np.float64))  # 1D vector
    uwind_field = np.squeeze(udata.astype(
        np.float64))  # 2D array, [nlat, nlon]
    vwind_field = np.squeeze(vdata.astype(
        np.float64))  # 2D array, [nlat, nlon]

    # check the latitude order (must be ascent for Magics plot)
    if lat[0] > lat[1]:
        lat = lat[::-1]
        uwind_field = uwind_field[::-1, :]
        vwind_field = vwind_field[::-1, :]

    # cut the data region
    if map_region is not None:
        loni, lonj, lati, latj = grid_subset(lon, lat, map_region)
        lon = lon[loni:lonj]
        lat = lat[lati:latj]
        uwind_field = uwind_field[lati:latj, loni:lonj]
        vwind_field = vwind_field[lati:latj, loni:lonj]
    lon, lat = np.meshgrid(lon, lat)

    # skip values and flatten
    uwind_field = uwind_field[::skip, ::skip].flatten()
    vwind_field = vwind_field[::skip, ::skip].flatten()
    lat = lat[::skip, ::skip].flatten()
    lon = lon[::skip, ::skip].flatten()

    # remove nan values
    index = (~np.isnan(uwind_field)) & (~np.isnan(vwind_field))
    uwind_field = uwind_field[index]
    vwind_field = vwind_field[index]
    if uwind_field.size == 0:
        return None
    lat = lat[index]
    lon = lon[index]

    # check meta information
    if metadata is None:
        metadata = {'units': 'm/s', 'long_name': 'wind field'}

    # put into magics minput function
    return magics.minput(input_type="geographical",
                         input_x_component_values=uwind_field,
                         input_y_component_values=vwind_field,
                         input_latitude_values=lat,
                         input_longitude_values=lon,
                         input_metadata=metadata)
Ejemplo n.º 11
0
steplat = -grib.grib_get(field, "jDirectionIncrementInDegrees")

firstlon = grib.grib_get(field, "longitudeOfFirstGridPointInDegrees")
steplon = grib.grib_get(field, "iDirectionIncrementInDegrees")

#Getting the field values
values = grib.grib_get_values(field).reshape(grib.grib_get(field, "Nj"),
                                             grib.grib_get(field, "Ni"))

#Convert from Kelvin to Celsius
values = values

data = magics.minput(
    input_field=values,
    input_field_initial_latitude=firstlat,
    input_field_latitude_step=steplat,
    input_field_initial_longitude=firstlon,
    input_field_longitude_step=steplon,
    input_mars_metadata=json.dumps(metadata),
)

#Setting the field contour
contour = magics.mcont(contour_shade="on",
                       legend="on",
                       legend_display_type="continuous",
                       contour_highlight="off",
                       contour_shade_method="area_fill",
                       contour_shade_colour_direction="clockwise",
                       contour_shade_colour_method="calculate",
                       contour_shade_max_level_colour="red",
                       contour_shade_min_level_colour=" blue")
Ejemplo n.º 12
0
max_date = '2013-09-30 00:00:00'
min_max_dates = [min_date, max_date]

dis_thlow = 1.0
dis_thmed = 2.0
dis_thhigh = 3.0
dis_thextr = 4.0

lows = [dis_thlow, dis_thlow]
mediums = [dis_thmed, dis_thmed]
highs = [dis_thhigh, dis_thhigh]
extremes = [min(dis_thextr, max_y), min(dis_thextr, max_y)]

low_input = mag.minput(input_x_type='date',
                       input_date_x_values=min_max_dates,
                       input_date_x2_values=min_max_dates,
                       input_y_values=lows,
                       input_y2_values=mediums)

medium_input = mag.minput(input_x_type='date',
                          input_date_x_values=min_max_dates,
                          input_date_x2_values=min_max_dates,
                          input_y_values=mediums,
                          input_y2_values=highs)

high_input = mag.minput(input_x_type='date',
                        input_date_x_values=min_max_dates,
                        input_date_x2_values=min_max_dates,
                        input_y_values=highs,
                        input_y2_values=extremes)
def plot_in_magics_boxplot(path, date, pointname, var, meta, y_axis_range, filename, lead_times,\
                           data_percentiles_eu_eps, point_values_eu_det):

    run_time = datetime.datetime(date['year'], date['month'], date['day'],
                                 date['hour'])

    if var == 't_2m' or var == 'wind_10m' or var == 'mslp' or var == 'clct':
        lead_times = [-1.0 * x for x in lead_times]
    elif var == 'prec_rate' or var == 'direct_rad' or var == 'diffuse_rad':
        lead_times = [-1.0 * x for x in lead_times]

    time_start = -123.
    time_end = 3.

    output_layout = magics.output(
        output_formats=['png'],
        output_name=path['base'] + path['plots'] + filename,
        output_name_first_page_number='off',
        output_width=1500,
        super_page_x_length=15.0,
        super_page_y_length=6.0,
    )

    page_layout = magics.page(
        layout='positional',
        page_x_position=0.0,
        page_y_position=0.0,
        page_x_length=15.0,
        page_y_length=6.0,
        page_id_line='off',
    )

    coord_system = magics.mmap(
        subpage_map_projection='cartesian',
        subpage_x_min=time_start,
        subpage_x_max=time_end,
        subpage_y_min=y_axis_range['min'],
        subpage_y_max=y_axis_range['max'],
        subpage_x_position=1.0,
        subpage_y_position=0.48,
        subpage_x_length=13.7,
        subpage_y_length=5.0,
    )

    vertical_axis = magics.maxis(
        axis_orientation='vertical',
        axis_grid='on',
        axis_tick_label_height=0.7,
        axis_grid_thickness=1,
        axis_grid_line_style='dash',
        axis_tick_interval=y_axis_range['interval'],
    )
    horizontal_axis = magics.maxis(
        axis_tick_interval=24,
        axis_tick_label='off',
        axis_title='off',
    )

    ########################################################################

    ##### icon-eu-eps #####
    bar_minmax_eu = magics.mgraph(
        graph_type='bar',
        graph_bar_colour='black',
        graph_bar_width=0.05,
    )
    data_minmax_eu = magics.minput(
        input_x_values=lead_times,
        input_y_values=data_percentiles_eu_eps[:, 0],
        input_y2_values=data_percentiles_eu_eps[:, 6],
    )

    bar1090_eu = magics.mgraph(
        graph_type='bar',
        graph_bar_colour='rgb(0, 150, 130)',  # KIT turquoise
        graph_bar_width=0.5,
    )
    data1090_eu = magics.minput(
        input_x_values=lead_times,
        input_y_values=data_percentiles_eu_eps[:, 1],
        input_y2_values=data_percentiles_eu_eps[:, 5],
    )

    bar2575_eu = magics.mgraph(
        graph_type='bar',
        graph_bar_colour='rgb(0, 150, 130)',  # KIT turquoise
        graph_bar_width=1.0,
        legend='on',
        legend_user_text='<font colour="black"> ICON-EU-EPS (20km)</font>')
    data2575_eu = magics.minput(
        input_x_values=lead_times,
        input_y_values=data_percentiles_eu_eps[:, 2],
        input_y2_values=data_percentiles_eu_eps[:, 4],
    )

    bar_median_eu = magics.mgraph(
        graph_type='bar',
        graph_bar_colour='black',
        graph_bar_width=1.0,
    )
    data_median_eu = magics.minput(
        input_x_values=lead_times,
        input_y_values=data_percentiles_eu_eps[:, 3] -
        (y_axis_range['max'] - y_axis_range['min']) / 400.,
        input_y2_values=data_percentiles_eu_eps[:, 3] +
        (y_axis_range['max'] - y_axis_range['min']) / 400.,
    )

    ##### icon-eu #####
    bar_eu_det = magics.mgraph(
        graph_line='off',
        graph_symbol='on',
        graph_symbol_marker_index=15,
        graph_symbol_height=0.2,
        graph_symbol_colour='white',
        graph_symbol_outline='on',
        graph_symbol_outline_colour='black',
        graph_symbol_outline_thickness=3,
        legend='on',
        legend_user_text='<font colour="black"> ICON-EU-DET (6.5km)</font>')
    data_eu_det = magics.minput(
        input_x_values=lead_times,
        input_y_values=point_values_eu_det[:],
    )

    ########################################################################

    analysis_line = magics.mgraph(
        graph_line_colour='rgb(0, 242, 209)',  # bright turquoise
        graph_line_thickness=3,
        legend='on',
        legend_user_text=
        '<font colour="black"> ICON-EU-DET (6.5km), 0h-Forecast</font>')
    analysis_value = magics.minput(
        input_x_values=[time_start, time_end],
        input_y_values=[y_axis_range['analysis'], y_axis_range['analysis']])

    if var == 't_2m' or var == 'mslp':
        ref_th = 5
    else:
        ref_th = 0
    ref_level_line = magics.mgraph(
        graph_line_colour='black',
        graph_line_thickness=ref_th,
    )
    ref_level_value = magics.minput(
        input_x_values=[time_start, time_end],
        input_y_values=[y_axis_range['ref'], y_axis_range['ref']])

    ########################################################################

    if var == 'direct_rad' or var == 'diffuse_rad':
        long_title_adjustment = 0.7
    else:
        long_title_adjustment = 0.0

    title_str = '{} in {}'.format(meta['var'], pointname)
    title = magics.mtext(
        text_line_1=title_str,
        text_font_size=1.0,
        text_colour='black',
        text_justification='centre',
        text_mode='positional',
        text_box_x_position=5.3 + long_title_adjustment,
        text_box_y_position=5.45,
        text_box_x_length=5.0,
        text_box_y_length=0.7,
    )

    ########################################################################

    timeshift = get_timeshift()
    initial_time = run_time.hour + timeshift

    if timeshift == 1:
        time_code = 'CET'  # UTC+1
    elif timeshift == 2:
        time_code = 'CEST'  # UTC+2

    if var == 'prec_rate' or var == 'direct_rad' or var == 'diffuse_rad':
        initial_time2 = initial_time + 6
        if initial_time2 == 26:
            initial_time2 = 2
        init_time_str = 'Forecast time: {}, {:02}-{:02}{}'.format(\
                            run_time.strftime('%a., %d %b. %Y'), initial_time, initial_time2, time_code)
    else:
        init_time_str = 'Forecast time: {}, {:02}{}'.format(\
                            run_time.strftime('%a., %d %b. %Y'), initial_time, time_code)

    init_time = magics.mtext(
        text_line_1=init_time_str,
        text_font_size=0.8,
        text_colour='black',
        text_justification='left',
        text_mode='positional',
        text_box_x_position=1.0,
        text_box_y_position=5.45,
        text_box_x_length=1.5,
        text_box_y_length=0.5,
    )

    unit_str = meta['units']
    unit = magics.mtext(
        text_line_1=unit_str,
        text_font_size=0.8,
        text_colour='black',
        text_justification='right',
        text_mode='positional',
        text_box_x_position=0.31,
        text_box_y_position=5.55,
        text_box_x_length=0.5,
        text_box_y_length=0.5,
    )

    if var == 't_2m':
        unit_special_str = 'o'
        correction = -0.12
    elif var == 'direct_rad' or var == 'diffuse_rad':
        unit_special_str = '2'
        correction = 0.06
    else:
        unit_special_str = ''
        correction = 0
    unit_special = magics.mtext(
        text_line_1=unit_special_str,
        text_font_size=0.4,
        text_colour='black',
        text_justification='right',
        text_mode='positional',
        text_box_x_position=0.31 + correction,
        text_box_y_position=5.55 + 0.14,
        text_box_x_length=0.5,
        text_box_y_length=0.5,
    )

    logo = magics.mimport(
        import_file_name=path['base'] + 'plots/logo/' + 'w2w_icon.png',
        import_x_position=13.74,
        import_y_position=5.52,
        import_height=0.474,
        import_width=1.000,
    )

    legend = magics.mlegend(
        legend_text_font_size=0.8,
        legend_box_mode='positional',
        legend_box_x_position=5.0,
        legend_box_y_position=5.03,
        legend_box_x_length=9.0,
        legend_box_y_length=0.5,
        legend_entry_text_width=90,
    )

    time_labels = ['-120h', '-96h', '-72h', '-48h', '-24h', '0h']
    spacing = 2.61
    left_pos = 0.58
    date1_label = magics.mtext(
        text_line_1=time_labels[0],
        text_font_size=0.8,
        text_colour='black',
        text_justification='centre',
        text_mode='positional',
        text_box_x_position=left_pos + 0 * spacing,
        text_box_y_position=0.0,
        text_box_x_length=1.5,
        text_box_y_length=0.3,
        text_border='off',
    )

    date2_label = magics.mtext(
        text_line_1=time_labels[1],
        text_font_size=0.8,
        text_colour='black',
        text_justification='centre',
        text_mode='positional',
        text_box_x_position=left_pos + 1 * spacing,
        text_box_y_position=0.0,
        text_box_x_length=1.5,
        text_box_y_length=0.3,
        text_border='off',
    )

    date3_label = magics.mtext(
        text_line_1=time_labels[2],
        text_font_size=0.8,
        text_colour='black',
        text_justification='centre',
        text_mode='positional',
        text_box_x_position=left_pos + 2 * spacing,
        text_box_y_position=0.0,
        text_box_x_length=1.5,
        text_box_y_length=0.3,
        text_border='off',
    )

    date4_label = magics.mtext(
        text_line_1=time_labels[3],
        text_font_size=0.8,
        text_colour='black',
        text_justification='centre',
        text_mode='positional',
        text_box_x_position=left_pos + 3 * spacing,
        text_box_y_position=0.0,
        text_box_x_length=1.5,
        text_box_y_length=0.3,
        text_border='off',
    )

    date5_label = magics.mtext(
        text_line_1=time_labels[4],
        text_font_size=0.8,
        text_colour='black',
        text_justification='centre',
        text_mode='positional',
        text_box_x_position=left_pos + 4 * spacing,
        text_box_y_position=0.0,
        text_box_x_length=1.5,
        text_box_y_length=0.3,
        text_border='off',
    )

    date6_label = magics.mtext(
        text_line_1=time_labels[5],
        text_font_size=0.8,
        text_colour='black',
        text_justification='centre',
        text_mode='positional',
        text_box_x_position=left_pos + 5 * spacing,
        text_box_y_position=0.0,
        text_box_x_length=1.5,
        text_box_y_length=0.3,
        text_border='off',
    )

    magics.context.silent = True
    magics.plot(
        output_layout,
        page_layout,
        coord_system,
        vertical_axis,
        horizontal_axis,
        ref_level_value,
        ref_level_line,
        data_minmax_eu,
        bar_minmax_eu,
        data1090_eu,
        bar1090_eu,
        data2575_eu,
        bar2575_eu,
        data_median_eu,
        bar_median_eu,
        data_eu_det,
        bar_eu_det,
        analysis_value,
        analysis_line,
        title,
        init_time,
        unit,
        unit_special,
        logo,
        legend,
        date1_label,
        date2_label,
        date3_label,
        date4_label,
        date5_label,
        date6_label,
    )

    return