Source code for out3Plot.amaPlots

""" functions for plotting ama event data and geometry info """

from shapely import wkb, LineString, Point, length
import shapely as sp
from shapely.ops import split
import numpy as np
import pandas as pd
import geopandas
import pathlib
import seaborn as sns
import configparser
import matplotlib.pyplot as plt

# local imports
from avaframe.in3Utils import cfgUtils
from avaframe.in3Utils import logUtils
import avaframe.in3Utils.fileHandlerUtils as fU
import avaframe.in3Utils.geoTrans as gT
import avaframe.out3Plot.plotUtils as pU


[docs]def plotPathAngle(dbData, cfgMain, nameEvent, tickOrigin='orig-transit'): """ make a two panel plot of avalanche thalweg, release point, runout point, origin, transit and deposition point and xy distances and computed angles Parameters ----------- dbData: pandas dataframe dataframe with geometry info of events cfgMain: configparser object config settings here used: avalancheDir, projstr, nameEvent: str name of xy distance lines and angles tickOrigin: str origin for panel 2 Sxy distance origin """ # fetch setup info avalancheDir = pathlib.Path(cfgMain['MAIN']['avalancheDir']) projstr = cfgMain['MAIN']['projstr'] # loop over all events in dbData for index, row in dbData.iterrows(): fig = plt.figure(figsize=(pU.figW*3, pU.figH)) fig.suptitle('%s (%s) analysis in %s' % (row['path_name'], row['event_id'], projstr)) # panel 1: plot map view of path, release, event point and snapped points ax1 = fig.add_subplot(121) ax1.set_title('event on thalweg in xy') ax1.plot(row['geom_path_ln3d_%s_resampled' % projstr].xy[0], row['geom_path_ln3d_%s_resampled' % projstr].xy[1], 'b', linestyle='dashed', label='thalweg ($S_{xy}$)') ax1.plot(row['%s_Line' % nameEvent].xy[0], row['%s_Line' % nameEvent].xy[1], 'b-', label=nameEvent) ax1.plot(row['geom_origin_pt3d_%s' % projstr].x, row['geom_origin_pt3d_%s' % projstr].y, '*', color='lightgray', markersize=12, label='origin pt') ax1.plot(row['geom_transit_pt3d_%s' % projstr].x, row['geom_transit_pt3d_%s' % projstr].y, '*', color='silver', markersize=12, label='transit pt') ax1.plot(row['geom_runout_pt3d_%s' % projstr].x, row['geom_runout_pt3d_%s' % projstr].y, '*', color='gray', markersize=12, label='deposition pt') ax1.plot(row['geom_rel_event_pt3d_%s' % projstr].x, row['geom_rel_event_pt3d_%s' % projstr].y, 'c+', markersize=20, label='release pt') ax1.plot(row['geom_rel_event_pt3d_%s_snapped' % projstr].x, row['geom_rel_event_pt3d_%s_snapped' % projstr].y, 'c*', markersize=14, label='snapped') ax1.plot(row['geom_event_pt3d_%s' % projstr].x, row['geom_event_pt3d_%s' % projstr].y, 'r+', markersize=20, label='runout pt') ax1.plot(row['geom_event_pt3d_%s_snapped' % projstr].x, row['geom_event_pt3d_%s_snapped' % projstr].y, 'r*', markersize=14, label='snapped') ax1.set_xlabel('x [m]') ax1.set_ylabel('y [m]') ax1.legend(loc='center left', bbox_to_anchor=(1, 0.5)) ax1.set_aspect('equal') # panel 2 plot xy distance and elevation drop and add angle info ax21 = fig.add_subplot(122) ax21.set_title('runout length in $S_{xy}$: %.1f [m], altitude drop: %.1f [m]' % (row['%s_Distance' % nameEvent], row['%s_LineAltDrop' % nameEvent])) z2coor = np.asarray([coord[2] for coord in row['geom_path_ln3d_%s' % projstr].coords]) ax21.plot(row['%s_PathDist' % nameEvent], z2coor, '--', color='lightgray', label='thalweg') # origin to deposition nameEvent = 'orig-depo' zcoor = [coord[2] for coord in row['%s_Line' % nameEvent].coords] ax21.plot(np.asarray(row['%s_LineStart' % nameEvent])+row['%s_LineDist' % nameEvent], zcoor, '-', color='lightgray', linewidth=4, alpha=1, label=nameEvent) ax21.plot([row['%s_LineStart' % nameEvent]+row['%s_LineDist' % nameEvent][0], row['%s_LineStart' % nameEvent]+row['%s_LineDist' % nameEvent][-1]], [row['%s_Line' % nameEvent].coords[0][2],row['%s_Line' % nameEvent].coords[-1][2]], '--', color='lightgray', linewidth=4, alpha=1., label='beta line [%.1f°]' % row['%s_Angle' % nameEvent]) # origin point - transit point nameEvent = 'orig-transit' zcoor = [coord[2] for coord in row['%s_Line' % nameEvent].coords] ax21.plot(np.asarray(row['%s_LineStart' % nameEvent])+row['%s_LineDist' % nameEvent], zcoor, '-', color='gray', linewidth=2.5, alpha=1., label=nameEvent) ax21.plot([row['%s_LineStart' % nameEvent]+row['%s_LineDist' % nameEvent][0], row['%s_LineStart' % nameEvent]+row['%s_LineDist' % nameEvent][-1]], [row['%s_Line' % nameEvent].coords[0][2], row['%s_Line' % nameEvent].coords[-1][2]], '--', color='gray', linewidth=3, alpha=1, label='theta line [%.1f°]' % row['%s_Angle' % nameEvent]) # travel length (release event) nameEvent = 'rel-runout' zcoor = [coord[2] for coord in row['%s_Line' % nameEvent].coords] ax21.plot(np.asarray(row['%s_LineStart' % nameEvent])+row['%s_LineDist' % nameEvent], zcoor, 'r-', label=nameEvent) ax21.plot([row['%s_LineStart' % nameEvent]+row['%s_LineDist' % nameEvent][0],row['%s_LineStart' % nameEvent]+row['%s_LineDist' % nameEvent][-1]], [row['%s_Line' % nameEvent].coords[0][2],row['%s_Line' % nameEvent].coords[-1][2]], 'r--', label='alpha line [%.1f°]' % row['%s_Angle' % nameEvent]) # add vertical horizontal helper lines for release and runout point xRel = row['%s_LineStart' % nameEvent]+row['%s_LineDist' % nameEvent][0] ax21.plot([xRel]*100, np.linspace(np.amin(z2coor), zcoor[0], 100), 'r', linestyle='dotted', alpha=0.5) xRun = row['%s_LineStart' % nameEvent]+row['%s_LineDist' % nameEvent][-1] ax21.plot([xRun]*100, np.linspace(np.amin(z2coor), zcoor[-1], 100), 'r', linestyle='dotted', alpha=0.5) xPath = row['%s_PathDist' % nameEvent] ax21.plot(np.linspace(xPath[0], xRel, 100), [zcoor[0]]*100, 'r', linestyle='dotted', alpha=0.5) ax21.plot(np.linspace(xPath[0], xRun, 100), [zcoor[-1]]*100, 'r', linestyle='dotted', alpha=0.5) # set tick Origin for x-axis in Sxy plot axTicks = ax21.get_xticks() tickSpacing = axTicks[1]- axTicks[0] xTicks = axTicks + row['%s_LineStart' % tickOrigin] ticksFromOrig = xTicks - row['%s_LineStart' % tickOrigin] ticksFromOrigStr = [('%.0f' % tF) for tF in ticksFromOrig] ax21.set_xticks(xTicks[1:-1]) ax21.set_xticklabels(ticksFromOrigStr[1:-1]) ax21.set_xlabel('$S_{xy}$ [m]') ax21.set_ylabel('altitude [m]') ax21.set_aspect('equal') ax21.legend(loc='center left', bbox_to_anchor=(1, 0.5)) # save figure outFile = ('%s_%s_analysis' % (row['path_name'], row['event_id'])) plotPath = pU.saveAndOrPlot({'pathResult': avalancheDir}, outFile, fig)
[docs]def plotHist(dbData, name, cfgMain, colorcode=''): """ create a histogram of name column of dbData Parameters ----------- dbData: pandas dataframe dataframe with geometry info of events and name_Line and name_Angle name: str name of Line and Angle to plot cfgMain: configparser configuration settings colorcode: str name of column to colorcode data """ # fetch setup info avalancheDir = pathlib.Path(cfgMain['MAIN']['avalancheDir']) projstr = cfgMain['MAIN']['projstr'] nameAngle = cfgMain['PLOT']['name_' + name] fig = plt.figure(figsize=(pU.figW, pU.figH)) ax3 = plt.subplot(111) if colorcode == '': sns.histplot(data=dbData, x='%s_Angle' % name) else: sns.histplot(data=dbData, x='%s_Angle' % name, hue=colorcode) ax3.set_title('Histogram of %s angle' % nameAngle) ax3.text(0.05, 0.05, ('%s events \nmean %s angle: %.1f°' % (len(dbData['%s_Angle' % name]), nameAngle, np.nanmean(dbData['%s_Angle' % name]))), transform=ax3.transAxes, fontsize=12, horizontalalignment='left', verticalalignment='bottom', alpha=0.8, bbox=dict(boxstyle="round", ec=(1., 1., 1.), fc=(1., 1., 1.), alpha=0.5)) ax3.set_xlabel('angle [°]') # save figure outFile = ('histogram_%s_angle' % (nameAngle)) plotPath = pU.saveAndOrPlot({'pathResult': avalancheDir}, outFile, fig)
[docs]def plotBoxPlot(dbData, colList, outDir, namePlot, renameCols=[]): """ create a boxplot of all columns of dbData Parameters ----------- dbData: pandas dataframe dataframe with geometry info colList: list names of columns in dbData to plot outDir: pathlib path or str path to folder where plot shall be saved to namePlot: str name of plot to be added to boxplot """ fig = plt.figure(figsize=(pU.figW, pU.figH)) ax3 = plt.subplot(111) sn = sns.boxplot(data=dbData[colList]) ax3.set_title('Distribution of %s for %d events' % (namePlot, len(dbData[colList[0]]))) ax3.set_ylabel(namePlot) if renameCols != []: sn.set_xticklabels(renameCols,rotation=90) else: sn.set_xticklabels(sn.get_xticklabels(),rotation=90) # save figure outFile = ('boxplot_%s' % namePlot) plotPath = pU.saveAndOrPlot({'pathResult': outDir}, outFile, fig)