ABMEv_plot.jl 5.44 KB
Newer Older
1
using RecipesBase
2
3
using Colors
import KernelDensity:kde,pdf
Victor's avatar
Victor committed
4
5
6
7
8
"""
    function plot(world::Array{U},p;what=["x","H"],trait = 1,tplot = false) where U <: Union{Missing,Agent}

# ARGS
- `what = ["x","H"]`: the plots you want to obtain
9
- `trait = 1`: the trait that will plotted regarding what you asked. `trait = 0` will plot the geotrait
Victor's avatar
Victor committed
10
11
- `tplot = false` used when calling xs, as it plots a snapshot of the world at a particular time
It should correspond to an integer, as it indexes the column to plot
12
13
14
15

# Options available
- `"x"`
- `"xs"`
Victor's avatar
Victor committed
16
17
18
"""

@recipe function plot(world::Array{U},p;what=["x","H"],trait = 1,tplot = 0) where U <: Union{Missing,Agent}
19
    tot_dim = size(world,2)*size(world,1)
20
    # We reduce time interval if it is too big
Victor's avatar
Victor committed
21
22
23
24
25
26
    # if tot_dim > 1e6 && size(world,2) >= 200
    #     p = copy(p)
    #     idx_reduced = floor.(Int,range(1,size(world,2),length = 200))
    #     p["tspan" ] = p["tspan"][idx_reduced]
    #     world = world[:,idx_reduced]
    # end
27
28
29
    # second condition is to make sure that the world corresponds to all the time steps
    # If not, then we can not get "x"
    if count(ismissing,world) > 0 && length(p["tspan"]) == size(world,2)
30
31
32
33
34
        tspan_ar = vcat([p["tspan"][i]*ones(Int(p["NMax"] - count(ismissing,world[:,i]))) for i in 1:length(p["tspan"]) ]...);
    else
        tspan_ar = repeat(p["tspan"],inner = size(world,1))
    end
    # tspan = Float64.(tspan)
35
    tend = p["tspan"][tplot > 0 ? tplot : length(p["tspan"])]
36
    world_sm = clean_world(world)
37
    if "x" in what
38
39
        d_i = []
        for i in 1:size(world,2)
40
            x = get_x(clean_world(world[:,i]),p["tspan"][i],trait)[:]
41
42
            append!(d_i,pdf(kde(x),x))
        end
43
        @series begin
44
        xarray = get_x.(world_sm,tspan_ar[:],trait)
45
            seriestype := :scatter
46
47
            markercolor := eth_grad_small[d_i ./ maximum(d_i)]
            # markercolor := :blue
48
            markerstrokewidth := 0
Victor's avatar
Victor committed
49
            seriesalpha :=1.
50
51
52
            xlabel := "time"
            ylabel := "trait value"
            label := ""
53
54
            grid := false
            # markersize := 2.3/1000*size(world_sm,1)
55
            tspan_ar[:],xarray[:]
56
57
        end
    end
58
59
60
    # we use this for discrete agents
    # world should be a one dimensional vector, corresponding to one time step only
    if "xs" in what
Victor's avatar
Victor committed
61
        d_i = []; xt_array = []; x1_array = []
62
63
        world_df_all = world2df(clean_world(world[:, tplot > 0 ? tplot : size(world,2) ]),tend,true)
        world_df_g = groupby(world_df_all,:x1)
64
        for world_df in world_df_g
65
            if trait == 0
66
                x = Float64.(world_df.g)
67
68
69
70
71
            else
                # fitness occupies first spot
                x = world_df[:,trait+1] ;
            end
            x1 =  world_df.x1;
72
            append!(d_i,pdf(kde(x),x))
Victor's avatar
Victor committed
73
74
            append!(xt_array,x)
            append!(x1_array,x1)
75
76
77
78
79
80
81
        end
        # TODO: we stopped here
        @series begin
            seriestype := :scatter
            markercolor := eth_grad_small[d_i ./ maximum(d_i)]
            # markercolor := :blue
            markerstrokewidth := 0
82
            # seriesalpha := 1.
Victor's avatar
Victor committed
83
            xaxis := "geographical position"
84
            xticks :=  sort!(unique(world_df_all.x1))
Victor's avatar
Victor committed
85
            yaxis := "trait value"
86
87
            label := ""
            grid := false
88
            marker := (:rect,20,1.)
Victor's avatar
Victor committed
89
            x1_array[:],xt_array[:]
90
91
        end
    end
92
93
    if "3dgeo" in what
        @series begin
94
95
        xarray = get_geo.(world_sm,tspan_ar)
        yarray = get_x(world_sm,2)
96
97
98
            seriestype := :scatter3d
            markercolor := "blue"
            markerstrokewidth := 0
Victor's avatar
Victor committed
99
            seriesalpha :=.1
100
101
102
103
            xlabel := "time"
            ylabel := "geotrait"
            zlabel := "trait value"
            label := ""
104
            # markersize := 2.3/1000*size(world_sm,1)
105
            tspan_ar,xarray[:],yarray[:]
106
107
108
109
        end
    end
    if "3d" in what
        @series begin
110
        xarray = get_x(world_sm,1)
111
        yarray = get_x(world_sm,2)
112
113
114
            seriestype := :scatter3d
            markercolor := "blue"
            markerstrokewidth := 0
Victor's avatar
Victor committed
115
            seriesalpha :=.1
116
117
118
119
            xlabel := "time"
            ylabel := "position"
            zlabel := "trait value"
            label := ""
120
            # markersize := 2.3/1000*size(world_sm,1)
121
            tspan_ar,xarray[:],yarray[:]
122
123
124
125
        end
    end
    # if "H" in what
    #     @series begin
126
    #         x = get_x.(world_sm,trait)
127
128
129
130
131
132
133
134
135
136
137
138
139
    #         linewidth := 2
    #         seriestype := :line
    #         label := "Interconnectedness"
    #         tspan,N^2 / 2 .* [H_discrete(x[:,i]) for i in tspan]
    #     end
    # end
    if "var" in what
        @series begin
            linewidth := 2
            seriestype := :line
            label := "Variance"
            xlabel := "Time"
            ylabel := "Variance"
140
            p["tspan"],var(world_sm,trait=trait)[:]
141
142
143
144
145
146
147
148
149
        end
    end
    if "vargeo" in what
        @series begin
            linewidth := 2
            seriestype := :line
            label := "Variance of geotrait"
            xlabel := "Time"
            ylabel := "Variance"
150
            p["tspan"],i->first(covgeo(world_sm[:,Int(i)]))
151
152
        end
    end
153
154
155
156
157
158
159
    # if "density_t" in what
    #     @series begin
    #         linewidth := 2
    #         seriestype := :plot3d
    #         label := "Variance of geotrait"
    #         xlabel := "Time"
    #         ylabel := "Variance"
160
    #         p["tspan"],i->first(covgeo(world_sm[:,Int(i)]))
161
162
    #     end
    # end
163
end