module plotting using StatsPlots, Plots, DataFrames, Statistics, Dates export plotEverything, plotBars, plotAllDistributions function plotEverything(df1, df2, settings, memory) println("Data is being plotted.") dateString = Dates.format(Dates.now(), "yyyy-mm-dd_HH.MM.SS") memory.focus = "" memory.yTicks = ((0-240):60:2000) #change for case memory.xRotation = 90.0 memory.xLabel = "stations" memory.yLabel = "" memory.color = [:chartreuse :yellow2 :lightskyblue :purple] memory.linewidth = 0 memory.barwidth = 0.7 memory.tickSize = 13 memory.guidefontsize = 20 memory.legendSize = 13 memory.titleSize = 23 memory.legendPosition = :outerright if settings.approach == "registration points" memory.yLabel = "deviation in seconds" memory.focus = "Line " * settings.analyzedLine memory.size = (2000, 1300) memory.direction1 = settings.stationDict[df1.station[length(df1.station)]] memory.direction2 = settings.stationDict[df2.station[length(df2.station)]] if settings.timePeriod[1] != "no" && settings.timePeriod[1] != "match day" && settings.timePeriod[1] != "rush hour" && settings.analyzedLine != "11" memory.title = memory.focus * " - Direction " * memory.direction1 * " - " * settings.timePeriod[1] * "/ " * settings.timePeriod[2] * " - " * settings.quantile[1] * " %-Quantile" p1 = plotBarsDays(df1, settings, memory) memory.title = memory.focus * " - Direction " * memory.direction2 * " - " * settings.timePeriod[1] * "/ " * settings.timePeriod[2] * " - " * settings.quantile[1] * " %-Quantile" p2 = plotBarsDays(df2, settings, memory) elseif settings.timePeriod[1] == "match day" && settings.analyzedLine != "11" memory.size = (900, 750) memory.title = memory.focus * " - Direction " * memory.direction1 * " - Match Day - " * settings.quantile[1] * " %-Quantile" p1 = plotBarsGameOrRushHour(df1, settings, memory) memory.title = memory.focus * " - Direction " * memory.direction2 * " - Match Day - " * settings.quantile[1] * " %-Quantile" p2 = plotBarsGameOrRushHour(df2, settings, memory) elseif settings.timePeriod[1] == "rush hour" && settings.analyzedLine != "11" memory.title = memory.focus * " - Direction " * memory.direction1 * " - Rush Hour - " * settings.quantile[1] * " %-Quantile" p1 = plotBarsGameOrRushHour(df1, settings, memory) memory.title = memory.focus * " - Direction " * memory.direction2 * " - Rush Hour - " * settings.quantile[1] * " % Quantile" p2 = plotBarsGameOrRushHour(df2, settings, memory) elseif settings.timePeriod[1] == "no" #no extra settings memory.title = memory.focus * " - Direction " * memory.direction1 p1 = plotBarsMultQuant(df1, settings, memory) memory.title = memory.focus * " - Direction " * memory.direction2 p2 = plotBarsMultQuant(df2, settings, memory) memory.title = memory.focus * " - Distribution" #plotDistributionInSec(df1, df2, settings, memory) plotDistributionInMin(df1, df2, settings, memory) if length(settings.allLines) == length(memory.distributionMin) #plotAllDistributions(settings, memory) #memory.title = "Distribution S-Bahn Stuttgart - 'new' quantiles" memory.title = "Distribution S-Bahn Stuttgart - 'danish' quantiles" p3 = plotAllDistributions(settings, memory) settings.allLines = ["1", "2", "3", "4", "5", "6", "60"] pop!(memory.distributionMin) memory.title = "" p4 = plotAllDistributions(settings, memory) all = plot(p3, p4, layout = (2, 1), legend = :bottomright) savefig( all, settings.outputFilePath * "\\Plots\\all_Lines" * "_" * dateString * ".pdf", ) end end dateString = Dates.format(Dates.now(), "yyyy-mm-dd_HH.MM.SS") all = plot(p1, p2, layout = (2, 1), legend = memory.legendPosition) savefig( all, settings.outputFilePath * "\\Plots\\" * memory.focus * " " * settings.approach * "_" * dateString * ".pdf", ) elseif settings.approach == "between registration points" myTitle1 = "" myTitle2 = "" memory.yLabel = "deviation - median (seconds)" memory.size = (900, 750) memory.focus = "Line " * settings.analyzedLine memory.direction1 = settings.stationDict[df1.point2[length(df1.point2)]] memory.direction2 = settings.stationDict[df2.point2[length(df2.point2)]] memory.title = memory.focus * " - Direction " * memory.direction1 p1 = plotBarsLineSection(df1, settings, memory) memory.title = memory.focus * " - Direction " * memory.direction2 p2 = plotBarsLineSection(df2, settings, memory) all = plot(p1, p2, layout = (2, 1), legend = false, size = (800, 600)) dateString = Dates.format(Dates.now(), "yyyy-mm-dd_HH.MM.SS") savefig( all, settings.outputFilePath * "\\Plots\\" * memory.focus * " " * settings.approach * "_" * dateString * ".pdf", ) end end function plotAllDistributions(settings, memory) Plots.pyplot() y = Any[] x = Any[] for quantile in settings.quantile push!(y, parse(Int, quantile)) end x = memory.distributionMin[1] #average september and october; source: DB a = [3, 6] b = [84.9, 95.8] tickX = (0:1:20) z = plot( a, b, label = "average deviation sept/ oct 2017", xlabel = "Deviation (min)", ylabel = "Quantile (%)", marker = true, legend = :bottomright, color = :red, xticks = tickX, size = (840, 600), ) colors = [ :gray71, :slateblue, :goldenrod, :darkcyan, :magenta4, :aqua, :deeppink, :tan4, ] z = plot!( x, y, title = memory.title, label = "line " * settings.allLines[1], marker = true, color = colors[1], ) for i = 2:length(memory.distributionMin) x = memory.distributionMin[i] colorN = colors[i] z = plot!( x, y, marker = true, color = colorN, label = "line " * settings.allLines[i], ) end dateString = Dates.format(Dates.now(), "yyyy-mm-dd_HH.MM.SS") savefig( z, settings.outputFilePath * "\\Plots\\all_lines_deviation(min)_" * dateString * ".pdf", ) return z end function plotBarsMultQuant(df, settings, memory) pyplot() stations = Array{Int,1}() depOrArr = Array{String,1}() quantile = Array{Float64,1}() type = Array{String,1}() stationList = Any[] for index = 1:length(df.station) push!(stationList, df.station[index] * "_" * df.DepOrArr[index]) for numberQuant = 1:length(settings.quantile) push!(stations, index) currentColumn = df[!, "quantile"*string(numberQuant)] push!(quantile, currentColumn[index]) push!(type, settings.quantile[numberQuant] * "% quantile") end end df_new = DataFrame(station = (stations), quantile = (quantile), type = (type)) memory.stationList = copy(stationList) x = plotBars(df_new, memory, settings) x = plot!( df.AverageDelay, linewidth = 3, linecolor = :blue, marker = true, label = "Average", ) return x end function plotBarsDays(df, settings, memory) pyplot() stations = Array{Int,1}() depOrArr = Array{String,1}() quantile = Array{Float64,1}() type = Array{String,1}() stationList = Any[] for index = 1:length(df.station) push!(stationList, df.station[index] * "_" * df.DepOrArr[index]) for day in settings.timePeriod push!(stations, index) currentColumn = df[!, "quantile"*settings.quantile[1]*"_"*day] push!(quantile, currentColumn[index]) push!(type, day) end end df_new = DataFrame(station = (stations), quantile = (quantile), type = (type)) memory.stationList = copy(stationList) x = plotBars(df_new, memory, settings) x = plot!( df[!, "average_"*settings.timePeriod[1]], linewidth = 3, linecolor = :orange, label = "Average Delay " * settings.timePeriod[1], ) x = plot!( df[!, "average_"*settings.timePeriod[2]], linewidth = 3, linecolor = :blue, label = "Average Delay " * settings.timePeriod[2], ) return x end function plotBarsLineSection(df, settings, memory) pyplot() x = bar( df.median, xticks = ([1:1:length(df.points);], df.points), yticks = ((0-270):30:210), legend = false, title = memory.title, ylabel = memory.yLabel, xlabel = memory.xLabel, size = (800, 300), bar_width = 1.0, xtickfontrotation = memory.xRotation, ) return x end function plotDistributionInSec(df1, df2, settings, memory) mean1 = (mean(df1.quantile1) + mean(df2.quantile1)) / 2 mean2 = (mean(df1.quantile2) + mean(df2.quantile2)) / 2 mean3 = (mean(df1.quantile3) + mean(df2.quantile3)) / 2 mean4 = (mean(df1.quantile4) + mean(df2.quantile4)) / 2 pyplot() y = Any[] for quantile in settings.quantile push!(y, parse(Int, quantile)) end x = [mean1, mean2, mean3, mean4] #Jahrendurschnitt Quelle: DB a = [3 * 60, 6 * 60] b = [84.9, 95.8] z = plot( a, b, title = memory.title, label = "average deviation september/october 2017", xlabel = "Deviation (sec)", ylabel = "Quantile", marker = true, legend = :bottomright, color = :red, ) z = plot!( x, y, marker = true, label = "Deviation Line" * settings.analyzedLine, ) dateString = Dates.format(Dates.now(), "yyyy-mm-dd_HH.MM.SS") savefig( z, settings.outputFilePath * "\\Plots\\Line_" * settings.analyzedLine * "_Deviation(sec)_" * dateString * ".pdf", ) end function plotDistributionInMin(df1, df2, settings, memory) mean1 = (mean(df1.quantile1) + mean(df2.quantile1)) / 2 / 60 mean2 = (mean(df1.quantile2) + mean(df2.quantile2)) / 2 / 60 mean3 = (mean(df1.quantile3) + mean(df2.quantile3)) / 2 / 60 mean4 = (mean(df1.quantile4) + mean(df2.quantile4)) / 2 / 60 pyplot() y = Any[] for quantile in settings.quantile push!(y, parse(Int, quantile)) end x = [mean1, mean2, mean3, mean4] push!(memory.distributionMin, x) #Jahrendurschnitt Quelle: DB a = [3, 6] b = [84.9, 95.8] z = plot( a, b, title = memory.title, label = "average deviation september/october 2017", xlabel = "Deviation (min)", ylabel = "Quantile", marker = true, legend = :bottomright, color = :red, ) z = plot!( x, y, marker = true, label = "Deviation " * memory.focus, color = :blue, ) dateString = Dates.format(Dates.now(), "yyyy-mm-dd_HH.MM.SS") savefig( z, settings.outputFilePath * "\\Plots\\" * memory.title * dateString * ".pdf", ) end function plotRailwayNetworkDistr(df1, df2, settings) mean1 = (mean(df1.quantile1) + mean(df2.quantile1)) / 2 / 60 mean2 = (mean(df1.quantile2) + mean(df2.quantile2)) / 2 / 60 mean3 = (mean(df1.quantile3) + mean(df2.quantile3)) / 2 / 60 mean4 = (mean(df1.quantile4) + mean(df2.quantile4)) / 2 / 60 pyplot() y = Any[] for quantile in settings.quantile push!(y, parse(Int, quantile)) end x = [mean1, mean2, mean3, mean4] z = plot( x, y, title = settings.objectInFocus * " - Distribution", label = "Deviation " * settings.objectInFocus, xlabel = "Deviation (min)", ylabel = "Quantile", marker = true, legend = :bottomright, ) #Durchschnitt September und Oktober Quelle: DB a = [3, 6] b = [84.9, 95.8] z = plot!(a, b, marker = true, label = "Average Deviation 2017") dateString = Dates.format(Dates.now(), "yyyy-mm-dd_HH.MM.SS") savefig( z, settings.outputFilePath * "\\Plots\\" * settings.objectInFocus * "_Deviation(min)_" * dateString * ".pdf", ) end function plotBarsGameOrRushHour(df, settings, memory) pyplot() stations = Array{Int,1}() depOrArr = Array{String,1}() quantile = Array{Float64,1}() type = Array{String,1}() stationList = Any[] for index = 1:length(df.station) push!(stationList, df.station[index] * "_" * df.DepOrArr[index]) for indicator in ["yes", "no"] push!(stations, index) currentColumn = df[!, "quantile"*settings.quantile[1]*"_"*indicator] push!(quantile, currentColumn[index]) push!(type, indicator) end end newType = Any[] if settings.timePeriod[1] == "rush hour" label1 = "Rush Hour" label2 = "'Normal' Time" elseif settings.timePeriod[1] == "match day" label1 = "Match Day" label2 = "'Normal' Day" end for x in type if x == "yes" push!(newType, label1) else push!(newType, label2) end end df_new = DataFrame(station = (stations), quantile = (quantile), type = (newType)) memory.size = (2000, 1000) memory.stationList = copy(stationList) x = plotBars(df_new, memory, settings) x = plot!( df[!, "average_yes"], linewidth = 3, linecolor = :orange, label = "Average Delay " * label1, ) x = plot!( df[!, "average_no"], linewidth = 3, linecolor = :blue, label = "Average Delay " * label2, ) return x end function plotBars(df, memory, settings) if settings.analyzedLine == "11" && memory.title == "Line 11 - Direction Herrenberg" memory.yTicks = ((0-240):120:3000) end x = groupedbar( df.quantile, xticks = ([1:1:size(memory.stationList, 1);], memory.stationList), yticks = memory.yTicks, group = df.type, ylabel = memory.yLabel, xlabel = memory.xLabel, title = memory.title, size = memory.size, bar_width = memory.barwidth, linewidth = memory.linewidth, tickfontsize = memory.tickSize, legendfontsize = memory.legendSize, guidefontsize = memory.guidefontsize, titlefontsize = memory.titleSize, xtickfontrotation = memory.xRotation, legend = memory.legendPosition, ) return x end end