From 939af7770be4cae4baeed87f0dce49080f3d6287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 12 Nov 2020 12:35:59 -0500 Subject: [PATCH 01/16] add betadiv example --- docs/make.jl | 3 +- docs/src/examples/beta-diversity.md | 68 +++++++++++++++++++ docs/src/examples/extinctions.md | 79 +++++++++++++++++++++ docs/src/examples/imputation.md | 74 ++++++++++++++++++++ docs/src/examples/modularity.md | 102 ++++++++++++++++++++++++++++ 5 files changed, 325 insertions(+), 1 deletion(-) create mode 100644 docs/src/examples/beta-diversity.md create mode 100644 docs/src/examples/extinctions.md create mode 100644 docs/src/examples/imputation.md create mode 100644 docs/src/examples/modularity.md diff --git a/docs/make.jl b/docs/make.jl index aeb6f60c3..3e8dc019d 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -31,7 +31,8 @@ makedocs( "Structural models" => "random/structure.md" ], "Examples" => [ - "Integration with Mangal" => "examples/integration_mangal.md" + "Integration with Mangal" => "examples/integration_mangal.md", + "Network beta-diversity" => "examples/beta-diversity.md" ] ] ) diff --git a/docs/src/examples/beta-diversity.md b/docs/src/examples/beta-diversity.md new file mode 100644 index 000000000..00d954f1f --- /dev/null +++ b/docs/src/examples/beta-diversity.md @@ -0,0 +1,68 @@ + +# Network beta-diversity + +In this section, we will measure the dissimilarity between bipartite +host-parasite networks. + +```@example betadiv +using EcologicalNetworks +using Plots +``` + +We use networks that span the entirety of Eurasia. Because these networks are +originally quantitative, we will remove the information on interaction strength +using `convert`. Note that we convert to an union type (`BinaryNetwork`) -- the +`convert` function will select the appropriate network type to return based on +the partiteness. The core operations on sets (`union`, `diff`, and `intersect`) +are implemented for the `BinaryNetwork` type. As such, generating the "metaweb" +(*i.e.* the list of all species and all interactions in the complete dataset) +is: + +```@example betadiv +metaweb = reduce(union, networks) +``` + +From this metaweb, we can measure $\beta_{OS}'$, *i.e.* the dissimilarity of +every network to the expectation in the metaweb. Measuring the distance between +two networks is done in two steps. Dissimilarity is first partitioned into three +components (common elements, and elements unique to both samples), then the +value is measured based on the cardinality of these components. The functions to +generate the partitions are `βos` (dissimilarity of interactions between shared +species), `βs` (dissimilarity of species composition), and `βwn` (whole network +dissimilarity). The output of these functions is passed to one of the functions +to measure the actual $β$-diversity. + +```@example betadiv +βcomponents = [βos(metaweb, n) for n in networks]; +βosprime = KGL02.(βcomponents); +``` + +Finally, we measure the pairwise distance between all networks (because we use a +symmetric measure, we only need $n\times(n-1)$ distances): + +```@example betadiv +S, OS, WN = Float64[], Float64[], Float64[] +for i in 1:(length(networks)-1) + for j in (i+1):length(networks) + push!(S, KGL02(βs(networks[i], networks[j]))) + push!(OS, KGL02(βos(networks[i], networks[j]))) + push!(WN, KGL02(βwn(networks[i], networks[j]))) + end +end +``` + +We can now visualize these data: + +```@example betadiv +p1 = histogram(βosprime, frame=:origin, bins=20, c=:white, leg=false, grid=false) +xaxis!(p1, "Difference to metaweb", (0,1)) +yaxis!(p1, (0,10)) + +p2 = plot([0,1],[0,1], c=:grey, ls=:dash, frame=:origin, grid=false, lab="", legend=:bottomleft) +scatter!(p2, S, OS, mc=:black, lab="shared sp.", msw=0.0) +scatter!(p2, S, WN, mc=:lightgrey, lab="all sp.", msw=0.0, m=:diamond) +xaxis!(p2, "Species dissimilarity", (0,1)) +yaxis!(p2, "Network dissimilarity", (0,1)) + +plot(p1,p2, size=(700,300)) +``` \ No newline at end of file diff --git a/docs/src/examples/extinctions.md b/docs/src/examples/extinctions.md new file mode 100644 index 000000000..926f2440b --- /dev/null +++ b/docs/src/examples/extinctions.md @@ -0,0 +1,79 @@ + +## Extinctions + +In this illustration, we will simulate extinctions of hosts, to show how +the package can be extended by using the core functions described in the +"Interface" section. Simply put, the goal of this example is to write a +function to randomly remove one host species, remove all parasite species that +end up not connected to a host, and measuring the effect of these extinctions +on the remaining network. Rather than measuring the network structure in +the function, we will return an array of networks to be manipulated later: + +```julia +function extinctions(N::T) where {T <: AbstractBipartiteNetwork} + + # We start by making a copy of the network to extinguish + Y = [copy(N)] + + # While there is at least one species remaining... + while richness(last(Y)) > 1 + # We remove one species randomly + remain = sample(species(last(Y); dims=2), richness(last(Y); dims=2)-1, replace=false) + + # Remaining species + R = last(Y)[:,remain] + simplify!(R) + + # Then add the simplified network (without the extinct species) to our collection + push!(Y, copy(R)) + end + return Y +end +``` + +One classical analysis is to remove host species, and count the richness of +parasite species, to measure their robustness to host extinctions [@MemmWase04] +-- this is usually done with multiple scenarios for order of extinction, but we +will focus on the random order here. Even though `EcologicalNetworks` has a +built-in function for richness, we can write a small wrapper around it: + +```julia +function parasite_richness(N::T) where {T<:BinaryNetwork} + return richness(N; dims=1) +end +``` + +Writing multiple functions that take a single argument allows to chain them in a +very expressive way: for example, measuring the richness on all timesteps in a +simulation is `N |> extinctions .|> parasite_richness`, or alternatively, +`parasite_richness.(extinctions(N))`. In @fig:extinctions, we illustrate the +output of this analysis on 100 simulations (average and standard deviation) for +one of the networks. + +```julia; echo=false +N = networks[50] + +X = Float64[] +Y = Float64[] +for i in 1:200 + timeseries = extinctions(N) + path_l = parasite_richness.(timeseries)./richness(N; dims=1) + prop_r = 1.0.-richness.(timeseries; dims=2)./richness(N; dims=2) + append!(X, prop_r) + append!(Y, path_l) +end +x = sort(unique(X)) +y = zeros(Float64, length(x)) +sy = zeros(Float64, length(x)) +for (i, tx) in enumerate(x) + y[i] = mean(Y[X.==tx]) + sy[i] = std(Y[X.==tx]) +end + +pl = plot(x, y, ribbon=sy, c=:black, fill=(:lightgrey), lw=2, ls=:dash, leg=false, grid=false, frame=:origin, xlim=(0,1), ylim=(0,1)) +xaxis!(pl, "Proportion of hosts removed") +yaxis!(pl, "Proportion of remaining parasites") +savefig("figures/extinctions.pdf") +``` + +![Output of 100 random extinction simulations, where the change in parasite richness was measured every timestep. This example shows how the basic functions of the package can be leveraged to build custom analyses rapidly.](figures/extinctions.pdf){#fig:extinctions} diff --git a/docs/src/examples/imputation.md b/docs/src/examples/imputation.md new file mode 100644 index 000000000..90c718701 --- /dev/null +++ b/docs/src/examples/imputation.md @@ -0,0 +1,74 @@ +## Interaction imputation + +In the final example, we will apply the linear filtering method of @StocPois17 +to suggest which negative interactions may have been missed in a network. +Starting from a binary network, this approach generates a quantitative network, +in which the weight of each interaction is the likelihood that it exists -- for +interactions absent from the original network, this suggests that they may have +been missed during sampling. This makes this approach interesting to guide +empirical efforts during the notoriously difficult task of sampling ecological +networks [@Jord16; @Jord16a]. + +In the approach of @StocPois17, the filtered interaction matrix (*i.e.* the +network of weights) is given by + +\begin{equation} +F_{ij} = \alpha_1Y_{ij} + \alpha_2\sum_k\frac{Y_{kj}}{n} + \alpha_3\sum_l\frac{Y_{il}}{m} + \alpha_4\frac{\sum Y}{n\times m} \,, +\end{equation} + +where $\alpha$ is a vector of weights summing to 1, and $(n,m)$ is the size of +the network. Note that the sums along rows and columns are actually the in and +out degree of species. This is implemented in `EcologicalNetworks` as the +`linearfilter` function. As in @StocPois17, we set all values in $\alpha$ to +$1/4$. We can now use this function to get the top interaction that, although +absent from the sampled network, is a strong candidate to exist based on the +linear filtering output: + +```julia +N = networks[50] +F = linearfilter(N) +``` + +We would like to separate the weights in 3: observed interactions, interactions +that are not observed in this network but are observed in the metaweb, and +interactions that are never observed. `EcologicalNetworks` has the +`has_interaction` function to test this, but because `BinaryNetwork` are using +Boolean values, we can look at the network directly: + +```julia +scores_present = sort( + filter(int -> N[int.from, int.to], interactions(F)), + by = int -> int.probability, + rev = true); + +scores_metaweb = sort( + filter(int -> (!N[int.from,int.to])&(metaweb[int.from, int.to]), interactions(F)), + by = int -> int.probability, + rev = true); + +scores_absent = sort( + filter(int -> !metaweb[int.from,int.to], interactions(F)), + by = int -> int.probability, + rev = true); +``` + +The results of this analysis are presented in @fig:imputation: the weights +$F_{ij}$ of interactions that are present locally ($Y_{ij}=\text{true}$) are +*always* larger that the weight of interactions that are absent; furthermore, +the weight of interactions that are absent locally are equal to the weight of +interactions that are also absent globally, strongly suggesting that this +network has been correctly sampled. + +```julia; echo=false +nx, ny = range(0.0, stop=1.0, length=length(scores_present)), [x.probability for x in scores_present] +pl = plot(nx, ny, grid=false, frame=:origin, lw=2, lab="Present locally", c=:black) +nx, ny = range(0.0, stop=1.0, length=length(scores_metaweb)), [x.probability for x in scores_metaweb] +plot!(pl, nx, ny, c=:black, lab="Present globally") +nx, ny = range(0.0, stop=1.0, length=length(scores_absent)), [x.probability for x in scores_absent] +plot!(pl, nx, ny, c=:darkgrey, ls=:dash, lab="Absent") +xaxis!(pl, "Relative rank", (0,1)) +yaxis!(pl, "Interaction weight", (0,1)) +savefig("figures/imputation.pdf") +``` + +![Relative weights (higher weights indicates a larger chance that the interaction has been missed when sampling) in one of the host-parasite networks according to the linear filter model of @StocPois17.](figures/imputation.pdf){#fig:imputation} diff --git a/docs/src/examples/modularity.md b/docs/src/examples/modularity.md new file mode 100644 index 000000000..9d2c36cb5 --- /dev/null +++ b/docs/src/examples/modularity.md @@ -0,0 +1,102 @@ +## Modularity + +In this example, we will show how the modular structure of an ecological +network can be optimized. Finding the optimal modular structure can be a +time-consuming process, as it relies on heuristic which are not guaranteed to +converge to the global maximum. There is no elegant alternative to trying +multiple approaches, repeating the process multiple times, and having +some luck. + +We will use again the first network from the @HadfKras14 dataset in this +example, which has a small number of species. For the first approach, we +will generate random partitions of the species across 3 to 12 modules, and +evaluate 20 replicate attempts for each of these combinations. The output +we are interested in is the number of modules, and the overall modularity +[@Barb07]. + +```julia +n = repeat(3:12, outer=20) +m = Array{Dict}(undef, length(n)) + +for i in eachindex(n) + # Each run returns the network and its modules + # We discard the network, and assign the modules to our object + _, m[i] = n_random_modules(n[i])(N) |> x -> brim(x...) +end +``` + +Now that we have the modular partition for every attempt, we can count the +modules in it, and measure its modularity: + +```julia +q = map(x -> Q(N,x), m); +c = (m .|> values |> collect) .|> unique .|> length; +``` + +The relationship between the two is represented in @fig:modularity. Out of +the `j length(c)` attempts, we want to get the most modular one, *i.e.* the +one with highest modularity. In some simple problems, there may be several +partitions with the highest value, so we can either take the first, or one +at random: + +```julia +optimal = rand(findall(q.== maximum(q))); +best_m = m[optimal]; +``` + +```julia; echo=false +p1 = scatter(c, q, c=:grey, msw=0.0, leg=false, frame=:origin, grid=false) +xaxis!(p1, "Number of modules") +yaxis!(p1, "Modularity", (0, 0.5)) + +I = initial(RandomInitialLayout, N) +for step in 1:4000 + position!(ForceDirectedLayout(2.5), I, N) +end +p2 = plot(I, N, aspectratio=1) +scatter!(p2, I, N, bipartite=true, nodefill=best_m, markercolor=:isolum) + +plot(p1, p2, size=(700,300)) +savefig("figures/modularity.pdf") +``` + +![Left, relationship between the number of modules in the optimized partition and its modularity. Right, representation of the network where every node is colored according to the module it belongs to in the optimal partition.](figures/modularity.pdf){#fig:modularity} + +This partitions has `j c[optimal]` modules. `EcologicalNetworks` has other +routines for modularity, such as LP [@LiuMura09], and a modified version +of LP relying on simulated annealing. We can finally look at the functional +roles of the species. + +```julia +roles = functional_cartography(N, best_m) +``` + +This function returns a tuple (an unmodifiable set of values) of coordinates +for every species, indicating its within-module contribution, and its +participation coefficient. These results can be plotted to separate species +in module hubs, network hubs, peripherals, and connectors (@fig:roles). Note +that in the context of ecological networks, this classification [following +@OlesBasc07] is commonly used. It derives from previous work by @GuimNune05 +on metabolic networks, which subdivides the place in 7 (rather than 4) +regions. For the sake of completeness, we have added the 7 regions of the +@GuimNune05 to the plot as well. + +```julia; echo=false +plot(Shape([-2, 2.5, 2.5, -2], [0, 0, 0.05, 0.05]), lab="", frame=:box, lc=:grey, opacity=0.3, c=:grey, lw=0.0, grid=false) #R1 +plot!(Shape([-2, 2.5, 2.5, -2], [0.05, 0.05, 0.62, 0.62]), lab="", c=:transparent) #R2 +plot!(Shape([-2, 2.5, 2.5, -2], [0.62, 0.62, 0.80, 0.80]), lab="", lc=:grey, opacity=0.3, c=:grey, lw=0.0) #R3 +plot!(Shape([-2, 2.5, 2.5, -2], [0.80, 0.80, 1.0, 1.0]), lab="", c=:transparent) #R4 + +plot!(Shape([2.5, 3.0, 3.0, 2.5], [0, 0, 0.3, 0.3]), lab="", c=:transparent) #R5 +plot!(Shape([2.5, 3.0, 3.0, 2.5], [0.3, 0.3, 0.75, 0.75]), lab="", lc=:grey, opacity=0.3, c=:grey, lw=0.0) #R6 +plot!(Shape([2.5, 3.0, 3.0, 2.5], [0.75, 0.75, 1.0, 1.0]), lab="", c=:transparent) #R7 + +vline!([2.5], c=:black, ls=:dot, lw=2.0) +hline!([0.62], c=:black, ls=:dot, lw=2.0) +collect(values(roles)) |> x -> scatter!(x, leg=false, c=:white) +yaxis!("Among-module connectivity", (0,1)) +xaxis!("Within-module degree", (-2, 3)) +savefig("figures/roles.pdf") +``` + +![Functional roles of the species in the most modular partition found. All species score very low along both axes, making them "peripherals" -- this is a strong indication that the modular structure is not meaningful.](figures/roles.pdf){#fig:roles} From bb7f1d475c27de57b3f8e629ac276ea62d8caed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 12 Nov 2020 12:41:49 -0500 Subject: [PATCH 02/16] modularity --- docs/Project.toml | 1 + docs/make.jl | 1 + docs/src/examples/modularity.md | 97 +++++++++++++++------------------ 3 files changed, 47 insertions(+), 52 deletions(-) diff --git a/docs/Project.toml b/docs/Project.toml index 7c9adea30..0554afa82 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -1,5 +1,6 @@ [deps] Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +EcologicalNetworksPlots = "9f7a259d-73a7-556d-a7a2-3eb122d3865b" Mangal = "b8b640a6-63d9-51e6-b784-5033db27bef2" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" diff --git a/docs/make.jl b/docs/make.jl index 3e8dc019d..b41b72de7 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -31,6 +31,7 @@ makedocs( "Structural models" => "random/structure.md" ], "Examples" => [ + "Modularity" => "examples/modularity.md", "Integration with Mangal" => "examples/integration_mangal.md", "Network beta-diversity" => "examples/beta-diversity.md" ] diff --git a/docs/src/examples/modularity.md b/docs/src/examples/modularity.md index 9d2c36cb5..a47da4870 100644 --- a/docs/src/examples/modularity.md +++ b/docs/src/examples/modularity.md @@ -1,20 +1,23 @@ -## Modularity - -In this example, we will show how the modular structure of an ecological -network can be optimized. Finding the optimal modular structure can be a -time-consuming process, as it relies on heuristic which are not guaranteed to -converge to the global maximum. There is no elegant alternative to trying -multiple approaches, repeating the process multiple times, and having -some luck. - -We will use again the first network from the @HadfKras14 dataset in this -example, which has a small number of species. For the first approach, we -will generate random partitions of the species across 3 to 12 modules, and -evaluate 20 replicate attempts for each of these combinations. The output -we are interested in is the number of modules, and the overall modularity -[@Barb07]. - -```julia +# Modularity + +In this example, we will show how the modular structure of an ecological network +can be optimized. Finding the optimal modular structure can be a time-consuming +process, as it relies on heuristic which are not guaranteed to converge to the +global maximum. There is no elegant alternative to trying multiple approaches, +repeating the process multiple times, and having some luck. + +```@example betadiv +using EcologicalNetworks +using Plots +using EcologicalNetworksPlots +``` + +For the first approach, we will generate random partitions of the species across +3 to 12 modules, and evaluate 20 replicate attempts for each of these +combinations. The output we are interested in is the number of modules, and the +overall modularity. + +```@example modularity n = repeat(3:12, outer=20) m = Array{Dict}(undef, length(n)) @@ -25,63 +28,56 @@ for i in eachindex(n) end ``` +```@example modularity +p1 = scatter(c, q, c=:grey, msw=0.0, leg=false, frame=:origin, grid=false) +xaxis!(p1, "Number of modules") +yaxis!(p1, "Modularity", (0, 0.5)) +``` + Now that we have the modular partition for every attempt, we can count the modules in it, and measure its modularity: -```julia +```@example modularity q = map(x -> Q(N,x), m); c = (m .|> values |> collect) .|> unique .|> length; ``` -The relationship between the two is represented in @fig:modularity. Out of -the `j length(c)` attempts, we want to get the most modular one, *i.e.* the -one with highest modularity. In some simple problems, there may be several -partitions with the highest value, so we can either take the first, or one -at random: +Out of all attempts, we want to get the most modular one, *i.e.* the one with +highest modularity. In some simple problems, there may be several partitions +with the highest value, so we can either take the first, or one at random: -```julia +```@example modularity optimal = rand(findall(q.== maximum(q))); best_m = m[optimal]; ``` -```julia; echo=false -p1 = scatter(c, q, c=:grey, msw=0.0, leg=false, frame=:origin, grid=false) -xaxis!(p1, "Number of modules") -yaxis!(p1, "Modularity", (0, 0.5)) +This can be plotted using `EcologicalNetworksPlots`: +```@example modularity I = initial(RandomInitialLayout, N) for step in 1:4000 position!(ForceDirectedLayout(2.5), I, N) end p2 = plot(I, N, aspectratio=1) scatter!(p2, I, N, bipartite=true, nodefill=best_m, markercolor=:isolum) - -plot(p1, p2, size=(700,300)) -savefig("figures/modularity.pdf") ``` -![Left, relationship between the number of modules in the optimized partition and its modularity. Right, representation of the network where every node is colored according to the module it belongs to in the optimal partition.](figures/modularity.pdf){#fig:modularity} +We can finally look at the functional roles of the species: -This partitions has `j c[optimal]` modules. `EcologicalNetworks` has other -routines for modularity, such as LP [@LiuMura09], and a modified version -of LP relying on simulated annealing. We can finally look at the functional -roles of the species. - -```julia +```@example modularity roles = functional_cartography(N, best_m) ``` -This function returns a tuple (an unmodifiable set of values) of coordinates -for every species, indicating its within-module contribution, and its -participation coefficient. These results can be plotted to separate species -in module hubs, network hubs, peripherals, and connectors (@fig:roles). Note -that in the context of ecological networks, this classification [following -@OlesBasc07] is commonly used. It derives from previous work by @GuimNune05 -on metabolic networks, which subdivides the place in 7 (rather than 4) -regions. For the sake of completeness, we have added the 7 regions of the -@GuimNune05 to the plot as well. - -```julia; echo=false +This function returns a tuple (an unmodifiable set of values) of coordinates for +every species, indicating its within-module contribution, and its participation +coefficient. These results can be plotted to separate species in module hubs, +network hubs, peripherals, and connectors. Note that in the context of +ecological networks, this classification is commonly used. It derives from +previous work on metabolic networks, which subdivides the plane in 7 (rather +than 4) regions. For the sake of completeness, we have added the 7 regions to +the plot as well. + +```@example modularity plot(Shape([-2, 2.5, 2.5, -2], [0, 0, 0.05, 0.05]), lab="", frame=:box, lc=:grey, opacity=0.3, c=:grey, lw=0.0, grid=false) #R1 plot!(Shape([-2, 2.5, 2.5, -2], [0.05, 0.05, 0.62, 0.62]), lab="", c=:transparent) #R2 plot!(Shape([-2, 2.5, 2.5, -2], [0.62, 0.62, 0.80, 0.80]), lab="", lc=:grey, opacity=0.3, c=:grey, lw=0.0) #R3 @@ -96,7 +92,4 @@ hline!([0.62], c=:black, ls=:dot, lw=2.0) collect(values(roles)) |> x -> scatter!(x, leg=false, c=:white) yaxis!("Among-module connectivity", (0,1)) xaxis!("Within-module degree", (-2, 3)) -savefig("figures/roles.pdf") ``` - -![Functional roles of the species in the most modular partition found. All species score very low along both axes, making them "peripherals" -- this is a strong indication that the modular structure is not meaningful.](figures/roles.pdf){#fig:roles} From 9f381f4ef11a18951d2b5133f50a30eb680d8663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 12 Nov 2020 17:04:36 -0500 Subject: [PATCH 03/16] load the networks --- docs/src/examples/beta-diversity.md | 3 +++ docs/src/examples/modularity.md | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/docs/src/examples/beta-diversity.md b/docs/src/examples/beta-diversity.md index 00d954f1f..53203dab3 100644 --- a/docs/src/examples/beta-diversity.md +++ b/docs/src/examples/beta-diversity.md @@ -19,6 +19,9 @@ are implemented for the `BinaryNetwork` type. As such, generating the "metaweb" is: ```@example betadiv +all_hp_data = filter(x -> occursin("Hadfield", x.Reference), web_of_life()); +ids = getfield.(all_hp_data, :ID); +networks = convert.(BinaryNetwork, web_of_life.(ids)); metaweb = reduce(union, networks) ``` diff --git a/docs/src/examples/modularity.md b/docs/src/examples/modularity.md index a47da4870..49a913659 100644 --- a/docs/src/examples/modularity.md +++ b/docs/src/examples/modularity.md @@ -18,6 +18,11 @@ combinations. The output we are interested in is the number of modules, and the overall modularity. ```@example modularity +all_hp_data = filter(x -> occursin("Hadfield", x.Reference), web_of_life()); +ids = getfield.(all_hp_data, :ID); +networks = convert.(BinaryNetwork, web_of_life.(ids)); +N = networks[1] + n = repeat(3:12, outer=20) m = Array{Dict}(undef, length(n)) From 0cd4fa7e69caf2f1042498f3c99ac15dffcfa139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 12 Nov 2020 19:40:27 -0500 Subject: [PATCH 04/16] Update modularity.md --- docs/src/examples/modularity.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/examples/modularity.md b/docs/src/examples/modularity.md index 49a913659..b2f4636c5 100644 --- a/docs/src/examples/modularity.md +++ b/docs/src/examples/modularity.md @@ -6,7 +6,7 @@ process, as it relies on heuristic which are not guaranteed to converge to the global maximum. There is no elegant alternative to trying multiple approaches, repeating the process multiple times, and having some luck. -```@example betadiv +```@example modularity using EcologicalNetworks using Plots using EcologicalNetworksPlots From 23b989e8ee545558131118ff9338be192cd7dc47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 26 Nov 2020 19:40:12 -0500 Subject: [PATCH 05/16] =?UTF-8?q?=F0=9F=94=A7=20update=20the=20workflows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/CI.yml | 20 ++------------------ .github/workflows/Documentation.yml | 24 ++++++++++++++++++++++++ .github/workflows/TagBot.yml | 2 +- 3 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 .github/workflows/Documentation.yml diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 2b259815d..c072b6dd2 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -16,7 +16,7 @@ jobs: version: - '1.3' - '1.4' - - 'nightly' + - '1.5' os: - ubuntu-latest - macOS-latest @@ -38,20 +38,4 @@ jobs: flags: unittests name: codecov-umbrella fail_ci_if_error: false - token: ${{ secrets.CODECOV }} - docs: - name: Documentation - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: julia-actions/setup-julia@v1 - with: - version: '1.4' - - run: | - julia --project=docs -e ' - using Pkg - Pkg.develop(PackageSpec(path=pwd())) - Pkg.instantiate()' - - run: julia --project=docs docs/make.jl - env: - GITHUB_TOKEN: ${{ secrets.TOKEN }} + token: ${{ secrets.CODECOV }} \ No newline at end of file diff --git a/.github/workflows/Documentation.yml b/.github/workflows/Documentation.yml new file mode 100644 index 000000000..b7ab141ac --- /dev/null +++ b/.github/workflows/Documentation.yml @@ -0,0 +1,24 @@ +name: Documentation + +on: + release: + push: + branches: + - master + tags: '*' + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@latest + with: + version: '1.5' + - name: Install dependencies + run: julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' + - name: Build and deploy + env: + GITHUB_TOKEN: ${{ secrets.TOKEN }} # For authentication with GitHub Actions token + run: julia --project=docs/ docs/make.jl \ No newline at end of file diff --git a/.github/workflows/TagBot.yml b/.github/workflows/TagBot.yml index d77d3a0c3..a335de66b 100644 --- a/.github/workflows/TagBot.yml +++ b/.github/workflows/TagBot.yml @@ -8,4 +8,4 @@ jobs: steps: - uses: JuliaRegistries/TagBot@v1 with: - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.TOKEN }} From 502a9ec2c20592670ffacf6512fde0ac57879cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 26 Nov 2020 19:42:05 -0500 Subject: [PATCH 06/16] =?UTF-8?q?=F0=9F=8E=A8=20update=20to=20EcoJulia=20l?= =?UTF-8?q?ogo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/assets/logo.png | Bin 50241 -> 30038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/src/assets/logo.png b/docs/src/assets/logo.png index 015109aa780d53f28b5610ac30c0ff0d940ceb89..4f73bcdda0eb03d3c387480c16e94982294a31b4 100644 GIT binary patch literal 30038 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 literal 50241 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 Date: Thu, 26 Nov 2020 19:46:21 -0500 Subject: [PATCH 07/16] =?UTF-8?q?=F0=9F=93=96=20update=20the=20example=20o?= =?UTF-8?q?n=20modularity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/examples/modularity.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/src/examples/modularity.md b/docs/src/examples/modularity.md index b2f4636c5..19398e330 100644 --- a/docs/src/examples/modularity.md +++ b/docs/src/examples/modularity.md @@ -1,5 +1,3 @@ -# Modularity - In this example, we will show how the modular structure of an ecological network can be optimized. Finding the optimal modular structure can be a time-consuming process, as it relies on heuristic which are not guaranteed to converge to the @@ -8,10 +6,12 @@ repeating the process multiple times, and having some luck. ```@example modularity using EcologicalNetworks -using Plots using EcologicalNetworksPlots +using Plots ``` +## Generating modular partitions + For the first approach, we will generate random partitions of the species across 3 to 12 modules, and evaluate 20 replicate attempts for each of these combinations. The output we are interested in is the number of modules, and the @@ -39,6 +39,8 @@ xaxis!(p1, "Number of modules") yaxis!(p1, "Modularity", (0, 0.5)) ``` +## Measuring modularity + Now that we have the modular partition for every attempt, we can count the modules in it, and measure its modularity: @@ -61,12 +63,14 @@ This can be plotted using `EcologicalNetworksPlots`: ```@example modularity I = initial(RandomInitialLayout, N) for step in 1:4000 - position!(ForceDirectedLayout(2.5), I, N) + position!(SpringElectric(1.2; gravity=0.1), I, N) end p2 = plot(I, N, aspectratio=1) scatter!(p2, I, N, bipartite=true, nodefill=best_m, markercolor=:isolum) ``` +## Species functional roles + We can finally look at the functional roles of the species: ```@example modularity From f6c8b352ae1cc1a0ad96da08e2bab85d49b64438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 26 Nov 2020 19:49:39 -0500 Subject: [PATCH 08/16] =?UTF-8?q?=F0=9F=93=96=20example=20on=20extinctions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/examples/extinctions.md | 40 +++++++++++++++----------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/docs/src/examples/extinctions.md b/docs/src/examples/extinctions.md index 926f2440b..d98f8cae2 100644 --- a/docs/src/examples/extinctions.md +++ b/docs/src/examples/extinctions.md @@ -1,15 +1,17 @@ +In this illustration, we will simulate extinctions of hosts, to show how the +package can be extended by using the core functions described in the "Interface" +section. Simply put, the goal of this example is to write a function to randomly +remove one host species, remove all parasite species that end up not connected +to a host, and measuring the effect of these extinctions on the remaining +network. Rather than measuring the network structure in the function, we will +return an array of networks to be manipulated later: -## Extinctions - -In this illustration, we will simulate extinctions of hosts, to show how -the package can be extended by using the core functions described in the -"Interface" section. Simply put, the goal of this example is to write a -function to randomly remove one host species, remove all parasite species that -end up not connected to a host, and measuring the effect of these extinctions -on the remaining network. Rather than measuring the network structure in -the function, we will return an array of networks to be manipulated later: +```@example ext +using EcologicalNetworks +using Plots +``` -```julia +```@example ext function extinctions(N::T) where {T <: AbstractBipartiteNetwork} # We start by making a copy of the network to extinguish @@ -32,12 +34,12 @@ end ``` One classical analysis is to remove host species, and count the richness of -parasite species, to measure their robustness to host extinctions [@MemmWase04] --- this is usually done with multiple scenarios for order of extinction, but we -will focus on the random order here. Even though `EcologicalNetworks` has a -built-in function for richness, we can write a small wrapper around it: +parasite species, to measure their robustness to host extinctions -- this is +usually done with multiple scenarios for order of extinction, but we will focus +on the random order here. Even though `EcologicalNetworks` has a built-in +function for richness, we can write a small wrapper around it: -```julia +```@example ext function parasite_richness(N::T) where {T<:BinaryNetwork} return richness(N; dims=1) end @@ -50,8 +52,8 @@ simulation is `N |> extinctions .|> parasite_richness`, or alternatively, output of this analysis on 100 simulations (average and standard deviation) for one of the networks. -```julia; echo=false -N = networks[50] +```@example ext +N = web_of_life("A_HP_050") X = Float64[] Y = Float64[] @@ -72,8 +74,4 @@ end pl = plot(x, y, ribbon=sy, c=:black, fill=(:lightgrey), lw=2, ls=:dash, leg=false, grid=false, frame=:origin, xlim=(0,1), ylim=(0,1)) xaxis!(pl, "Proportion of hosts removed") -yaxis!(pl, "Proportion of remaining parasites") -savefig("figures/extinctions.pdf") ``` - -![Output of 100 random extinction simulations, where the change in parasite richness was measured every timestep. This example shows how the basic functions of the package can be leveraged to build custom analyses rapidly.](figures/extinctions.pdf){#fig:extinctions} From 08d05ac0ccee8879fe7da6973bf841efa7d90349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 26 Nov 2020 19:53:06 -0500 Subject: [PATCH 09/16] =?UTF-8?q?=F0=9F=93=96=20update=20the=20navigation?= =?UTF-8?q?=20structure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/make.jl | 76 +++++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/docs/make.jl b/docs/make.jl index ef43a876a..15c7a6890 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -5,42 +5,44 @@ using EcologicalNetworks using Random makedocs( - sitename = "EcologicalNetworks", - authors = "Timothée Poisot", - modules = [EcologicalNetworks], - pages = [ - "Index" => "index.md", - "Interface" => [ - "Types" => "interface/types.md", - "Conversions" => "interface/conversions.md", - "Core functions" => "interface/highlevel.md" - ], - "Network measures" => [ - "Links" => "properties/links.md", - "Modularity" => "properties/modularity.md", - "Nestedness" => "properties/nestedness.md", - "Motifs" => "properties/motifs.md", - "Centrality and paths" => "properties/paths.md", - "Overlap and similarity" => "properties/overlap.md", - "Beta-diversity" => "properties/betadiversity.md", - "Resilience" => "properties/resilience.md", - "Information theory" => "properties/information.md" - ], - "Random networks" => [ - "Null models" => "random/null.md", - "Structural models" => "random/structure.md" - ], - "Examples" => [ - "Modularity" => "examples/modularity.md", - "Integration with Mangal" => "examples/integration_mangal.md", - "Network beta-diversity" => "examples/beta-diversity.md" - ] - ] - ) + sitename = "EcologicalNetworks", + authors = "Timothée Poisot", + modules = [EcologicalNetworks], + pages = [ + "Index" => "index.md", + "Interface" => [ + "Types" => "interface/types.md", + "Conversions" => "interface/conversions.md", + "Core functions" => "interface/highlevel.md" + ], + "Examples" => [ + "Modularity" => "examples/modularity.md", + "Integration with Mangal" => "examples/integration_mangal.md", + "Network beta-diversity" => "examples/beta-diversity.md" + ], + "Basic measures" => [ + "Links" => "properties/links.md", + "Modularity" => "properties/modularity.md", + "Nestedness" => "properties/nestedness.md", + "Motifs" => "properties/motifs.md", + "Centrality and paths" => "properties/paths.md", + "Overlap and similarity" => "properties/overlap.md" + ], + "Advanced information" => [ + "Beta-diversity" => "properties/betadiversity.md", + "Resilience" => "properties/resilience.md", + "Information theory" => "properties/information.md" + ], + "Generating networks" => [ + "Null models" => "random/null.md", + "Structural models" => "random/structure.md" + ] + ] +) deploydocs( - deps = Deps.pip("pygments", "python-markdown-math"), - repo = "github.com/EcoJulia/EcologicalNetworks.jl.git", - devbranch = "master", - push_preview = true - ) +deps = Deps.pip("pygments", "python-markdown-math"), +repo = "github.com/EcoJulia/EcologicalNetworks.jl.git", +devbranch = "master", +push_preview = true +) From 779f6f8045aff85dc1ddb451f4ccc6d6ae1bdc26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 26 Nov 2020 19:54:58 -0500 Subject: [PATCH 10/16] =?UTF-8?q?=F0=9F=93=96=20extinctions=20example?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/make.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/make.jl b/docs/make.jl index 15c7a6890..67b98bdd0 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -18,7 +18,8 @@ makedocs( "Examples" => [ "Modularity" => "examples/modularity.md", "Integration with Mangal" => "examples/integration_mangal.md", - "Network beta-diversity" => "examples/beta-diversity.md" + "Network beta-diversity" => "examples/beta-diversity.md", + "Extinctions" => "examples/extinctions.md" ], "Basic measures" => [ "Links" => "properties/links.md", From 6464340b2559d37e744bfaf4fd0b3e8606ac7810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 26 Nov 2020 19:56:15 -0500 Subject: [PATCH 11/16] =?UTF-8?q?=F0=9F=93=96=20add=20margin=20to=20plots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/examples/extinctions.md | 2 +- docs/src/examples/modularity.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/examples/extinctions.md b/docs/src/examples/extinctions.md index d98f8cae2..40aee9dfa 100644 --- a/docs/src/examples/extinctions.md +++ b/docs/src/examples/extinctions.md @@ -72,6 +72,6 @@ for (i, tx) in enumerate(x) sy[i] = std(Y[X.==tx]) end -pl = plot(x, y, ribbon=sy, c=:black, fill=(:lightgrey), lw=2, ls=:dash, leg=false, grid=false, frame=:origin, xlim=(0,1), ylim=(0,1)) +pl = plot(x, y, ribbon=sy, c=:black, fill=(:lightgrey), lw=2, ls=:dash, leg=false, margin = 10mm, grid=false, frame=:origin, xlim=(0,1), ylim=(0,1)) xaxis!(pl, "Proportion of hosts removed") ``` diff --git a/docs/src/examples/modularity.md b/docs/src/examples/modularity.md index 19398e330..7f6bdf6fc 100644 --- a/docs/src/examples/modularity.md +++ b/docs/src/examples/modularity.md @@ -34,7 +34,7 @@ end ``` ```@example modularity -p1 = scatter(c, q, c=:grey, msw=0.0, leg=false, frame=:origin, grid=false) +p1 = scatter(c, q, c=:grey, msw=0.0, leg=false, frame=:origin, grid=false, margin = 10mm) xaxis!(p1, "Number of modules") yaxis!(p1, "Modularity", (0, 0.5)) ``` @@ -87,7 +87,7 @@ than 4) regions. For the sake of completeness, we have added the 7 regions to the plot as well. ```@example modularity -plot(Shape([-2, 2.5, 2.5, -2], [0, 0, 0.05, 0.05]), lab="", frame=:box, lc=:grey, opacity=0.3, c=:grey, lw=0.0, grid=false) #R1 +plot(Shape([-2, 2.5, 2.5, -2], [0, 0, 0.05, 0.05]), lab="", frame=:box, lc=:grey, opacity=0.3, c=:grey, lw=0.0, grid=false, margin = 10mm) #R1 plot!(Shape([-2, 2.5, 2.5, -2], [0.05, 0.05, 0.62, 0.62]), lab="", c=:transparent) #R2 plot!(Shape([-2, 2.5, 2.5, -2], [0.62, 0.62, 0.80, 0.80]), lab="", lc=:grey, opacity=0.3, c=:grey, lw=0.0) #R3 plot!(Shape([-2, 2.5, 2.5, -2], [0.80, 0.80, 1.0, 1.0]), lab="", c=:transparent) #R4 From 4bf2ddfef204329bce0947e9861c2983e9868a49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 26 Nov 2020 20:10:33 -0500 Subject: [PATCH 12/16] =?UTF-8?q?=E2=9A=A1=20improve=20the=20interactions?= =?UTF-8?q?=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/types/utilities.jl | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/types/utilities.jl b/src/types/utilities.jl index cad1f33ef..6f1eb27ca 100644 --- a/src/types/utilities.jl +++ b/src/types/utilities.jl @@ -95,7 +95,7 @@ function has_interaction(N::AbstractEcologicalNetwork, i::Int64, j::Int64) @assert i <= size(N.A, 1) @assert j <= size(N.A, 2) # This should be reasonably general... - return N[i,j] != zero(typeof(N[i,j])) + return !iszero(N[i,j]) end """ @@ -104,9 +104,7 @@ end Modifies the network so that its diagonal is set to the appropriate zero. """ function nodiagonal!(N::AbstractUnipartiteNetwork) - for i in 1:richness(N) - N.A[i,i] = zero(eltype(N.A)) - end + N.A[diagind(N.A)] .= zero(eltype(N.A)) end """ @@ -415,21 +413,24 @@ that are quantitative, there is a `strength` field. This functions allows to iterate over interactions in a network in a convenient way. """ function interactions(N::AbstractEcologicalNetwork) - edges_accumulator = NamedTuple[] fields = [:from, :to] + types = [last(eltype(N)),last(eltype(N))] if typeof(N) <: ProbabilisticNetwork push!(fields, :probability) + push!(types,first(eltype(N))) end if typeof(N) <: QuantitativeNetwork push!(fields, :strength) + push!(types,first(eltype(N))) end + edges_accumulator = Vector{NamedTuple{tuple(fields...),Tuple{tuple(types...)}}}(undef, links(N)) sp1 = species(N; dims=1) sp2 = species(N; dims=2) - for i in eachindex(sp1) - s1 = sp1[i] - for j in eachindex(sp2) + cursor = 1 + for (i, s1) in enumerate(sp1) + for (j, s2) in enumerate(sp2) if has_interaction(N, i, j) - values = Any[s1, sp2[j]] + values = Any[s1, sp2] if typeof(N) <: ProbabilisticNetwork push!(values, N[i,j]) end @@ -437,7 +438,8 @@ function interactions(N::AbstractEcologicalNetwork) push!(values, N[i,j]) end int_nt = NamedTuple{tuple(fields...)}(tuple(values...)) - push!(edges_accumulator, int_nt) + edges_accumulator[cursor] = int_nt + cursor = cursor + 1 end end end From 927e2dad125c8a6a977745a10c6f1c538153ca40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 26 Nov 2020 20:24:30 -0500 Subject: [PATCH 13/16] =?UTF-8?q?=E2=9A=A1=20speedup=20interactions=20by?= =?UTF-8?q?=20pre-allocating=20the=20array?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/types/utilities.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/types/utilities.jl b/src/types/utilities.jl index 6f1eb27ca..6dc1ee0f4 100644 --- a/src/types/utilities.jl +++ b/src/types/utilities.jl @@ -423,14 +423,15 @@ function interactions(N::AbstractEcologicalNetwork) push!(fields, :strength) push!(types,first(eltype(N))) end - edges_accumulator = Vector{NamedTuple{tuple(fields...),Tuple{tuple(types...)}}}(undef, links(N)) + non_zero = sum(.!iszero.(N.A)) # Number of non-zero entries in the matrix + edges_accumulator = Vector{NamedTuple{tuple(fields...),Tuple{types...}}}(undef, non_zero) sp1 = species(N; dims=1) sp2 = species(N; dims=2) cursor = 1 for (i, s1) in enumerate(sp1) for (j, s2) in enumerate(sp2) if has_interaction(N, i, j) - values = Any[s1, sp2] + values = Any[s1, s2] if typeof(N) <: ProbabilisticNetwork push!(values, N[i,j]) end From 149cea344728e5e1a58e44eb03eb52e5182290c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 26 Nov 2020 20:29:36 -0500 Subject: [PATCH 14/16] =?UTF-8?q?=F0=9F=94=A7=20update=20the=20syntax?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/structuralmodels/cascademodel.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/structuralmodels/cascademodel.jl b/src/structuralmodels/cascademodel.jl index 7d130d589..ce5af0ad3 100644 --- a/src/structuralmodels/cascademodel.jl +++ b/src/structuralmodels/cascademodel.jl @@ -24,7 +24,7 @@ function cascademodel(S::Int64, Co::Float64) A = UnipartiteNetwork(zeros(Bool, (S, S))) # For each species randomly asscribe rank e - e = Random.sort(rand(S), rev=false) + e = Random.sort(rand(S); rev=false) # Probability for linking two species p = 2*Co*S/(S - 1) From 67909879b21ea2077bec152403963509ded542f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Thu, 26 Nov 2020 20:31:56 -0500 Subject: [PATCH 15/16] =?UTF-8?q?=F0=9F=93=96=20use=20a=20modular=20networ?= =?UTF-8?q?k=20for=20the=20modularity=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/examples/integration_mangal.md | 2 -- docs/src/examples/modularity.md | 5 +---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/docs/src/examples/integration_mangal.md b/docs/src/examples/integration_mangal.md index e8faa1304..13d98ae92 100644 --- a/docs/src/examples/integration_mangal.md +++ b/docs/src/examples/integration_mangal.md @@ -1,5 +1,3 @@ -# Integration with Mangal.jl - In this example, we will show how `EcologicalNetworks.jl` can be integrated with [`Mangal.jl`](https://github.com/EcoJulia/Mangal.jl) to analyse many ecological networks. Specifically, we will show how to analyse the association between meaningful network properties (i.e. connectance, nestedness, and modularity) using all food webs archived on the [`mangal.io`](https://mangal.io/#/) online database. To conduct this analysis, we need to upload the following packages: diff --git a/docs/src/examples/modularity.md b/docs/src/examples/modularity.md index 7f6bdf6fc..4ab006dd9 100644 --- a/docs/src/examples/modularity.md +++ b/docs/src/examples/modularity.md @@ -18,10 +18,7 @@ combinations. The output we are interested in is the number of modules, and the overall modularity. ```@example modularity -all_hp_data = filter(x -> occursin("Hadfield", x.Reference), web_of_life()); -ids = getfield.(all_hp_data, :ID); -networks = convert.(BinaryNetwork, web_of_life.(ids)); -N = networks[1] +N = convert(BiparriteMetwork, web_of_life("M_PA_003")) n = repeat(3:12, outer=20) m = Array{Dict}(undef, length(n)) From 7336853d775b7a426250aad170798b96013d0797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Poisot?= Date: Fri, 27 Nov 2020 09:01:57 -0500 Subject: [PATCH 16/16] =?UTF-8?q?=F0=9F=93=8A=20fix=20the=20margins=20in?= =?UTF-8?q?=20the=20example=20plots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/src/examples/beta-diversity.md | 5 +++-- docs/src/examples/extinctions.md | 1 + docs/src/examples/integration_mangal.md | 10 +++++++--- docs/src/examples/modularity.md | 1 + 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/src/examples/beta-diversity.md b/docs/src/examples/beta-diversity.md index 53203dab3..e31e9f5e9 100644 --- a/docs/src/examples/beta-diversity.md +++ b/docs/src/examples/beta-diversity.md @@ -7,6 +7,7 @@ host-parasite networks. ```@example betadiv using EcologicalNetworks using Plots +using Plots.PlotMeasures ``` We use networks that span the entirety of Eurasia. Because these networks are @@ -57,11 +58,11 @@ end We can now visualize these data: ```@example betadiv -p1 = histogram(βosprime, frame=:origin, bins=20, c=:white, leg=false, grid=false) +p1 = histogram(βosprime, frame=:origin, bins=20, c=:white, leg=false, grid=false, margin=10mm) xaxis!(p1, "Difference to metaweb", (0,1)) yaxis!(p1, (0,10)) -p2 = plot([0,1],[0,1], c=:grey, ls=:dash, frame=:origin, grid=false, lab="", legend=:bottomleft) +p2 = plot([0,1],[0,1], c=:grey, ls=:dash, frame=:origin, grid=false, lab="", legend=:bottomleft, margin=10mm) scatter!(p2, S, OS, mc=:black, lab="shared sp.", msw=0.0) scatter!(p2, S, WN, mc=:lightgrey, lab="all sp.", msw=0.0, m=:diamond) xaxis!(p2, "Species dissimilarity", (0,1)) diff --git a/docs/src/examples/extinctions.md b/docs/src/examples/extinctions.md index 40aee9dfa..5f615468d 100644 --- a/docs/src/examples/extinctions.md +++ b/docs/src/examples/extinctions.md @@ -9,6 +9,7 @@ return an array of networks to be manipulated later: ```@example ext using EcologicalNetworks using Plots +using Plots.PlotMeasures ``` ```@example ext diff --git a/docs/src/examples/integration_mangal.md b/docs/src/examples/integration_mangal.md index 13d98ae92..92570cc8c 100644 --- a/docs/src/examples/integration_mangal.md +++ b/docs/src/examples/integration_mangal.md @@ -7,6 +7,7 @@ using EcologicalNetworks using Mangal using DataFrames using Plots +using Plots.PlotMeasures ``` We first retrieve relevant metadata for all 1,386 networks archived on `mangal.io` using the `Mangal.jl` package. We count the number of species $S$ and the total number of interactions $L$ in each network, as well as their number of trophic interactions (predation and herbivory). We store these information in a data frame along with the networks' ID numbers, and print the first 5 elements. Due to the high number of networks we handle, note that this step might take some time to run. @@ -101,7 +102,8 @@ scatter(foodweb_measures.connect, foodweb_measures.nested, alpha=0.6, color=pal, lab="", framestyle=:box, xlabel="Connectance", - ylabel="Nestedness") + ylabel="Nestedness", + margin = 10mm) ``` ```@example mangal @@ -109,7 +111,8 @@ scatter(foodweb_measures.connect, foodweb_measures.modul, alpha=0.6, color=pal, lab="",framestyle=:box, xlabel="Connectance", - ylabel="Modularity") + ylabel="Modularity", + margin = 10mm) ``` ```@example mangal @@ -117,5 +120,6 @@ scatter(foodweb_measures.modul, foodweb_measures.nested, alpha=0.6, color=pal, lab="", framestyle=:box, xlabel="Modularity", - ylabel="Nestedness") + ylabel="Nestedness", + margin = 10mm) ``` diff --git a/docs/src/examples/modularity.md b/docs/src/examples/modularity.md index 4ab006dd9..28934ade0 100644 --- a/docs/src/examples/modularity.md +++ b/docs/src/examples/modularity.md @@ -8,6 +8,7 @@ repeating the process multiple times, and having some luck. using EcologicalNetworks using EcologicalNetworksPlots using Plots +using Plots.PlotMeasures ``` ## Generating modular partitions