Skip to content

Commit 02d4ff9

Browse files
committed
Updated links. R code formated by LSP.
1 parent 23b23de commit 02d4ff9

File tree

2 files changed

+62
-63
lines changed

2 files changed

+62
-63
lines changed

presentation/hybseq_course.tex

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ \section{Introduction}
110110
\begin{itemize}
111111
\item Course \href{https://github.com/V-Z/hybseq-course}{Git (slides with all links)} and \href{https://is.cuni.cz/studium/eng/predmety/index.php?do=predmet&kod=MB120C117}{information in SIS} (\href{https://is.cuni.cz/studium/predmety/index.php?do=predmet&kod=MB120C117}{česky})
112112
\item \alert{Scripts} \url{https://github.com/V-Z/hybseq-scripts} \textbf{shown in the course} --- clone the Git repository and adapt to your needs
113-
\item Download presentation from \url{https://trapa.cz/en/hybseq-course-2024}
113+
\item Download presentation from \url{https://trapa.cz/en/hybseq-course-2025}
114114
\item Most of the work is done in Linux/UNIX (macOS,~\ldots) command line, so that good knowledge of work in command line is essential, good starting point can be my Linux and MetaCentrum course \url{https://soubory.trapa.cz/linuxcourse/}
115115
\item Many tasks are done in R, so that at least basic knowledge of R is needed, good starting point can be my R course \url{https://soubory.trapa.cz/rcourse/}
116116
\item Processing HybSeq data is computationally demanding (it requires plenty of resources), during the course we use \href{https://www.metacentrum.cz/en/Sluzby/Grid/}{MetaCentrum, Czech National Grid Infrastructure} (\href{https://www.metacentrum.cz/cs/Sluzby/Grid/}{česky}) (slide~\ref{CESNET}), but any computing cluster or powerful desktop (for patient users;-) can be used
@@ -216,7 +216,7 @@ \subsection{Software needed}
216216
\item \href{https://blast.ncbi.nlm.nih.gov/doc/blast-help/downloadblastdata.html\#downloadblastdata}{BLAST+} (used by \href{https://github.com/mossmatters/HybPiper/wiki}{HybPiper})
217217
\item \href{https://github.com/lh3/bwa}{BWA} (used by \href{https://github.com/mossmatters/HybPiper/wiki}{HybPiper})
218218
\item \href{https://www.wsi.uni-tuebingen.de/lehrstuehle/algorithms-in-bioinformatics/software/dendroscope/}{Dendroscope} --- visualize outputs of \href{https://phylogenomics.rice.edu/html/phylonet.html}{PhyloNet}
219-
\item \href{https://www.ebi.ac.uk/about/vertebrate-genomics/software/exonerate}{Exonerate} (used by \href{https://github.com/mossmatters/HybPiper/wiki}{HybPiper})
219+
\item \href{https://github.com/nathanweeks/exonerate}{Exonerate} (used by \href{https://github.com/mossmatters/HybPiper/wiki}{HybPiper})
220220
\item \href{https://www.gnu.org/software/parallel/}{GNU Parallel} (used by \href{https://github.com/mossmatters/HybPiper/wiki}{HybPiper} and in BASH scripts)
221221
\item \href{https://github.com/mossmatters/HybPiper/wiki}{HybPiper} --- recovering genes from targeted sequence capture data
222222
\item \href{http://www.iqtree.org/}{IQ-TREE} --- gene trees
@@ -252,10 +252,7 @@ \subsection{MetaCentrum computing environment}
252252
\item Information about data storage \url{https://du.cesnet.cz/en/start} (\href{https://du.cesnet.cz/cs/start}{česky}) contains detailed usage instructions
253253
\item Information about MetaCentrum \url{https://www.metacentrum.cz/en/} (\href{https://www.metacentrum.cz/cs/}{česky})
254254
\item Most of practical information for users are at \url{https://docs.metacentrum.cz/}
255-
\begin{itemize}
256-
\item Old \href{https://wiki.metacentrum.cz/}{wiki} is deprecated
257-
\end{itemize}
258-
\item To start work see at least \href{https://docs.metacentrum.cz/access/log-in/}{access}, \href{https://docs.metacentrum.cz/computing/}{computing}, \href{https://docs.metacentrum.cz/data/data-within/}{work with data} and some \href{https://docs.metacentrum.cz/tutorials/}{tutorial}
255+
\item To start work see at least \href{https://docs.metacentrum.cz/en/docs/access/log-in}{access}, \href{https://docs.metacentrum.cz/en/docs/computing/concepts}{computing}, \href{https://docs.metacentrum.cz/en/docs/data/large-data}{work with data} and some \href{https://docs.metacentrum.cz/en/docs/tutorials}{tutorial}
259256
\item Of course, good knowledge of work in Linux command line (BASH) is needed\ldots
260257
\end{itemize}
261258
\vfill
@@ -275,8 +272,8 @@ \subsection{MetaCentrum computing environment}
275272
\item Current state and usage as available at \url{https://metavo.metacentrum.cz/}
276273
\item Manage your user account at \url{http://metavo.metacentrum.cz/en/myaccount/} (\href{https://metavo.metacentrum.cz/cs/myaccount/}{česky})
277274
\item Personal view on actual resources and running tasks is at \url{https://metavo.metacentrum.cz/pbsmon2/person}
278-
\item Listing of available applications \url{https://docs.metacentrum.cz/software/search-soft/}
279-
\item It has several \href{https://docs.metacentrum.cz/access/log-in/}{front ends} where users log, various \href{https://docs.metacentrum.cz/data/data-within/}{storages}, and thousands of computers (nodes) doing the calculations --- they are not accessed directly to run task
275+
\item Listing of available applications \url{https://docs.metacentrum.cz/en/docs/software/alphabet}
276+
\item It has several \href{https://docs.metacentrum.cz/en/docs/access/log-in}{front ends} where users log, various \href{https://docs.metacentrum.cz/en/docs/data/large-data}{storages}, and thousands of computers (nodes) doing the calculations --- they are not accessed directly to run task
280277
\begin{itemize}
281278
\item Distributed nature and number of front ends and storages may be confusing for beginners
282279
\end{itemize}
@@ -292,7 +289,7 @@ \subsection{MetaCentrum computing environment}
292289

293290
\begin{frame}[fragile]{Launching of tasks}
294291
\begin{itemize}
295-
\item \url{https://docs.metacentrum.cz/computing/run-basic-job/}
292+
\item \url{https://docs.metacentrum.cz/en/docs/computing/run-basic-job}
296293
\item Personal view \url{https://metavo.metacentrum.cz/pbsmon2/person} has nice overview of available resources and tasks and allows comfortable construction of submission command
297294
\end{itemize}
298295
\vfill
@@ -313,10 +310,10 @@ \subsection{MetaCentrum computing environment}
313310
\begin{frame}[fragile]{Key MetaCentrum commands}
314311
\begin{itemize}
315312
\item MetaCentrum is \enquote{just} normal Linux server --- work as usually
316-
\item Command \texttt{module} loads/unloads selected \href{https://docs.metacentrum.cz/software/search-soft/}{application} (\texttt{module add r})
313+
\item Command \texttt{module} loads/unloads selected \href{https://docs.metacentrum.cz/en/docs/software/alphabet}{application} (\texttt{module add r})
317314
\item Tasks (BASH scripts) are submitted for computing by \texttt{qsub} --- the script must copy the data into \texttt{\$SCRATCHDIR} and do all calculations there
318315
\begin{itemize}
319-
\item It has plenty of options how to specify requirements (see \href{https://docs.metacentrum.cz/computing/run-basic-job/}{help})
316+
\item It has plenty of options how to specify requirements (see \href{https://docs.metacentrum.cz/en/docs/computing/run-basic-job}{help})
320317
\end{itemize}
321318
\item Queued and running jobs can be seen by \texttt{qstat -u \$USER} (\texttt{qstat} has much more options) and any job can be terminated by \texttt{qdel 123456789} (number from \texttt{qstat})
322319
\end{itemize}
@@ -419,7 +416,7 @@ \subsection{Data download and start}
419416
\begin{frame}[fragile]{Data download}
420417
\label{datadownload}
421418
\begin{itemize}
422-
\item MetaCentrum storages have sometimes too limited quota for such a large data --- see your \href{https://metavo.metacentrum.cz/en/myaccount/kvoty}{quotas} (\href{http://metavo.metacentrum.cz/cs/myaccount/kvoty}{česky}), see \href{https://docs.metacentrum.cz/data/quotas/}{details}
419+
\item MetaCentrum storages have sometimes too limited quota for such a large data --- see your \href{https://metavo.metacentrum.cz/en/myaccount/kvoty}{quotas} (\href{http://metavo.metacentrum.cz/cs/myaccount/kvoty}{česky}), see \href{https://docs.metacentrum.cz/en/docs/data/quotas}{details}
423420
\item The \href{https://github.com/V-Z/hybseq-scripts}{pipeline} produce a lot of data (especially \href{https://github.com/mossmatters/HybPiper/}{HybPiper}; gene trees can be also large) --- ensure to have enough space to store everything
424421
\begin{itemize}
425422
\item Especially \textbf{HybPiper produces a lot of files} --- \alert{user may reach quota for number of files}, not necessarily (only) amount of data
@@ -1173,7 +1170,7 @@ \subsection{Filtering trees}
11731170
\begin{spluscode}
11741171
trees # See original trees
11751172
# Remove trees identified in the PCoA plot
1176-
trees[c("Assembly_12866", "Assembly_14143", "Assembly_1500")] <- NULL
1173+
trees[c("Assembly_1033", "Assembly_10103", "Assembly_10222")] <- NULL
11771174
trees # See new object
11781175
# Possibly remove trees with too few tips
11791176
print(trees, details=TRUE)
@@ -1539,7 +1536,7 @@ \subsection{Comparing trees}
15391536
# Pie chart: concordance (blue) top conflict (green), other conflict
15401537
# (red), no signal (gray). Run phypartspiecharts.py to get the graphics:
15411538
python phypartspiecharts.py --svg_name trees_good_res.svg \
1542-
parsimony_sp_tree.nwk trees_good_res 219
1539+
parsimony_sp_tree.nwk trees_good_res 20
15431540
\end{bashcode}
15441541
\end{frame}
15451542

trees_filtration.r

Lines changed: 51 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# Install needed packages
2-
install.packages(pkgs=c("ape", "ade4", "distory", "gplots", "ggplot2", "phangorn", "phytools"), repos="https://mirrors.nic.cz/R/", dependencies="Imports")
2+
install.packages(pkgs = c("ape", "ade4", "distory", "gplots", "ggplot2", "phangorn", "phytools"), repos = "https://mirrors.nic.cz/R/", dependencies = "Imports")
33
# Install kdetrees package (removed from CRAN)
44
# Ensure package 'devtools' is installed
5-
if( ! 'devtools' %in% installed.packages() ) { install.packages('devtools') }
5+
if (!"devtools" %in% installed.packages()) {
6+
install.packages("devtools")
7+
}
68
# Install 'kdetrees' from https://github.com/V-Z/kdetrees Git repository
7-
devtools::install_github('V-Z/kdetrees')
9+
devtools::install_github("V-Z/kdetrees")
810

911
# Load libraries
1012
library(ape)
@@ -20,77 +22,77 @@ library(phytools)
2022
setwd("~/dokumenty/vyuka/hybseq/")
2123

2224
# Load the list of trees
23-
trees <- read.tree(file="trees_ml_exons.nwk")
25+
trees <- read.tree(file = "trees_ml_exons.nwk")
2426
trees
25-
print(trees, details=TRUE)
27+
print(trees, details = TRUE)
2628

2729
# Compute distance of topological similarities
28-
trees.d <- dist.topo(x=trees, method="score", mc.cores=4) # Set number of cores according to your computer
30+
trees.d <- dist.topo(x = trees, method = "score", mc.cores = 4) # Set number of cores according to your computer
2931

3032
# Plot the heatmap (package gplots)
31-
png(filename="trees_dist.png", width=10000, height=10000)
32-
heatmap.2(x=as.matrix(trees.d), Rowv=FALSE, Colv="Rowv", dendrogram="none", symm=TRUE, scale="none", na.rm=TRUE, revC=FALSE, col=rainbow(15), cellnote=as.matrix(trees.d), notecex=1, notecol="white", trace="none", labRow=rownames(as.matrix(trees.d)), labCol=colnames(as.matrix(trees.d)), key=FALSE, main="Correlation matrix of topographical distances")
33-
dev.off() # Saves the image
33+
png(filename = "trees_dist.png", width = 10000, height = 10000)
34+
heatmap.2(x = as.matrix(trees.d), Rowv = FALSE, Colv = "Rowv", dendrogram = "none", symm = TRUE, scale = "none", na.rm = TRUE, revC = FALSE, col = rainbow(15), cellnote = as.matrix(trees.d), notecex = 1, notecol = "white", trace = "none", labRow = rownames(as.matrix(trees.d)), labCol = colnames(as.matrix(trees.d)), key = FALSE, main = "Correlation matrix of topographical distances")
35+
dev.off() # Saves the image
3436

3537
# Test if the distance matrix is Euclidean
36-
is.euclid(distmat=as.dist(trees.d), plot=TRUE, tol=1e-05)
38+
is.euclid(distmat = as.dist(trees.d), plot = TRUE, tol = 1e-05)
3739

3840
# PCoA
39-
trees.pcoa <- dudi.pco(d=trees.d, scannf=FALSE, nf=5)
41+
trees.pcoa <- dudi.pco(d = trees.d, scannf = FALSE, nf = 5)
4042
trees.pcoa
4143

4244
# Plot PCoA
43-
s.label(dfxy=trees.pcoa$li)
44-
s.kde2d(dfxy=trees.pcoa$li, cpoint=0, add.plot=TRUE)
45-
add.scatter.eig(trees.pcoa[["eig"]], 3,1,2, posi="topright")
45+
s.label(dfxy = trees.pcoa$li)
46+
s.kde2d(dfxy = trees.pcoa$li, cpoint = 0, add.plot = TRUE)
47+
add.scatter.eig(trees.pcoa[["eig"]], 3, 1, 2, posi = "topright")
4648
title("PCoA of matrix of pairwise trees distances")
4749

4850
# Remove outlying trees
4951
trees
50-
trees[c("Assembly_12866", "Assembly_14143", "Assembly_1500")] <- NULL
52+
trees[c("Assembly_1033", "Assembly_10103", "Assembly_10222")] <- NULL
5153
trees
5254

5355
# Now you can repeat recalculation of distance matrix and PCoA and possibly remove more trees...
5456

5557
# # Possibly remove trees with too few tips
56-
# print(trees, details=TRUE)
58+
# print(trees, details = TRUE)
5759
# trees[c(1, 2, 3, 4)] <- NULL
5860
# trees
5961

6062
# # Possibly remove rare tips
61-
# trees <- lapply(X=trees, FUN=drop.tip, tip=c("Amomum-sp7_S308_L001", "Amomum-trilobum_S12_L001"))
63+
# trees <- lapply(X = trees, FUN = drop.tip, tip = c("Amomum-sp7_S308_L001", "Amomum-trilobum_S12_L001"))
6264
# class(trees) <- "multiPhylo" # Use after usage of lapply to multiPhylo
6365

6466
# Run kdetrees to detect outliers - play with k
6567
?kdetrees # See options for kdetrees
66-
trees.kde <- kdetrees(trees=trees, k=0.9, distance="dissimilarity", topo.only=FALSE, greedy=TRUE)
68+
trees.kde <- kdetrees(trees = trees, k = 0.9, distance = "dissimilarity", topo.only = FALSE, greedy = TRUE)
6769
# See text results with list of outlying trees
6870
trees.kde
6971
# See graphical results
70-
plot(x=trees.kde)
71-
hist(x=trees.kde)
72+
plot(x = trees.kde)
73+
hist(x = trees.kde)
7274
# See removed trees
7375
plot.multiPhylo(trees.kde[["outliers"]])
7476
# Save removed trees
75-
write.tree(phy=trees.kde[["outliers"]], file="trees_outliers.nwk")
77+
write.tree(phy = trees.kde[["outliers"]], file = "trees_outliers.nwk")
7678
# Save kdetrees report
77-
write.table(x=as.data.frame(x=trees.kde), file="trees_scores.tsv", quote=FALSE, sep="\t")
79+
write.table(x = as.data.frame(x = trees.kde), file = "trees_scores.tsv", quote = FALSE, sep = "\t")
7880
# Extract passing trees
7981
trees.good <- trees[names(trees) %in% names(trees.kde[["outliers"]]) == FALSE]
8082
trees.good
8183
# Save passing trees
82-
write.tree(phy=trees.good, file="trees_good.nwk")
84+
write.tree(phy = trees.good, file = "trees_good.nwk")
8385

8486
# Compute parsimony super tree
8587
?superTree # See help first...
86-
tree.sp <- superTree(tree=trees.good, method="NNI", rooted=TRUE, trace=2, start=NULL, multicore=TRUE)
88+
tree.sp <- superTree(tree = trees.good, method = "NNI", rooted = TRUE, trace = 2, start = NULL, multicore = TRUE)
8789
tree.sp # See details
8890
# Root it
89-
tree.sp <- root(phy=tree.sp, outgroup=c("Riedelia-arfakensis_S49_L001", "Zingiber-officinale_S242_L001"), resolve.root=TRUE)
91+
tree.sp <- root(phy = tree.sp, outgroup = c("Riedelia-arfakensis_S49_L001", "Zingiber-officinale_S242_L001"), resolve.root = TRUE)
9092
# Save parsimony super tree
91-
write.tree(phy=tree.sp, file="parsimony_sp_tree.nwk")
93+
write.tree(phy = tree.sp, file = "parsimony_sp_tree.nwk")
9294
# Plot parsimony super tree
93-
plot.phylo(x=tree.sp, type="phylogram", edge.width=2, label.offset=0.01, cex=1.2)
95+
plot.phylo(x = tree.sp, type = "phylogram", edge.width = 2, label.offset = 0.01, cex = 1.2)
9496
add.scale.bar()
9597
# Tune display of the tree...
9698

@@ -99,34 +101,35 @@ add.scale.bar()
99101
?phytools::mrp.supertree
100102
?phangorn::coalSpeciesTree
101103
# All trees must be ultrametric - chronos scale them
102-
trees.ultra <- lapply(X=trees.good, FUN=chronos, model="correlated")
104+
trees.ultra <- lapply(X = trees.good, FUN = chronos, model = "correlated")
103105
class(trees.ultra) <- "multiPhylo"
104106
# Calculate the species tree
105107
# tree.sp.mean <- speciesTree(x=trees.ultra, FUN=mean)
106-
tree.sp2 <- mrp.supertree(tree=trees.good, method="optim.parsimony", rooted=TRUE)
107-
tree.sp2 <- root(phy=tree.sp2, outgroup=c("Riedelia-arfakensis_S49_L001", "Zingiber-officinale_S242_L001"), resolve.root=TRUE)
108-
plot.phylo(x=tree.sp2, type="phylogram", edge.width=2, label.offset=0.01, cex=1.2)
108+
tree.sp2 <- mrp.supertree(tree = trees.good, method = "optim.parsimony", rooted = TRUE)
109+
tree.sp2 <- root(phy = tree.sp2, outgroup = c("Riedelia-arfakensis_S49_L001", "Zingiber-officinale_S242_L001"), resolve.root = TRUE)
110+
plot.phylo(x = tree.sp2, type = "phylogram", edge.width = 2, label.offset = 0.01, cex = 1.2)
109111

110112
# # Consensus networks
111-
# ?consensusNet
113+
# # Requires all trees to have same set of tips (no missing data)
114+
# # ?consensusNet
112115
# # Compute consensus network
113-
# tree.net <- consensusNet(obj=trees.good, prob=0.25)
116+
# # tree.net <- consensusNet(obj = trees.good, prob = 0.25)
114117
# # Plot 2D or 3D
115-
# plot(x=tree.net, planar=FALSE, type="2D", use.edge.length=TRUE, show.tip.label=TRUE, show.edge.label=TRUE, show.node.label=TRUE, show.nodes=TRUE, edge.color="black", tip.color="blue") # 2D
116-
# plot(x=tree.net, planar=FALSE, type="3D", use.edge.length=TRUE, show.tip.label=TRUE, show.edge.label=TRUE, show.node.label=TRUE, show.nodes=TRUE, edge.color="black", tip.color="blue") # 3D
118+
# # plot(x = tree.net, planar = FALSE, type = "2D", use.edge.length = TRUE, show.tip.label = TRUE, show.edge.label = TRUE, show.node.label = TRUE, show.nodes = TRUE, edge.color = "black", tip.color = "blue") # 2D
119+
# # plot(x = tree.net, planar = FALSE, type = "3D", use.edge.length = TRUE, show.tip.label = TRUE, show.edge.label = TRUE, show.node.label = TRUE, show.nodes = TRUE, edge.color = "black", tip.color = "blue") # 3D
117120

118121
# Save trees.good in NEXUS for PhyloNet
119-
write.nexus(trees.good, file="trees_good.nex", translate=FALSE)
122+
write.nexus(trees.good, file = "trees_good.nex", translate = FALSE)
120123

121124
# Cophyloplots - comparing 2 phylogenetic trees
122125
# We need 2 column matrix with tip labels
123-
tips.labels <- matrix(data=c(sort(tree.sp[["tip.label"]]), sort(tree.sp2[["tip.label"]])), nrow=length(tree.sp[["tip.label"]]), ncol=2)
126+
tips.labels <- matrix(data = c(sort(tree.sp[["tip.label"]]), sort(tree.sp2[["tip.label"]])), nrow = length(tree.sp[["tip.label"]]), ncol = 2)
124127
# Draw the tree, play with graphical parameters
125128
# Click to nodes to rotate them to get better display
126-
cophyloplot(x=tree.sp, y=tree.sp2, assoc=tips.labels, use.edge.length=FALSE, space=60, length.line=1, gap=2, type="phylogram", rotate=TRUE, col="red", lwd=1.5, lty=2)
129+
cophyloplot(x = tree.sp, y = tree.sp2, assoc = tips.labels, use.edge.length = FALSE, space = 60, length.line = 1, gap = 2, type = "phylogram", rotate = TRUE, col = "red", lwd = 1.5, lty = 2)
127130
# Slihtly better display in phytools::cophylo
128-
trees.cophylo <- cophylo(tr1=tree.sp, tr2=tree.sp2, assoc=tips.labels, rotate=TRUE)
129-
plot.cophylo(x=trees.cophylo, lwd=2, link.type="curved")
131+
trees.cophylo <- cophylo(tr1 = tree.sp, tr2 = tree.sp2, assoc = tips.labels, rotate = TRUE)
132+
plot.cophylo(x = trees.cophylo, lwd = 2, link.type = "curved")
130133

131134
# Density trees
132135
is.rooted.multiPhylo(trees.ultra) # rooted
@@ -135,15 +138,14 @@ is.binary.multiPhylo(trees.ultra) # binary bifurcating
135138
# See help page
136139
?phangorn::densiTree
137140
# Plotting density trees
138-
densiTree(x=trees.ultra, scaleX=TRUE, col=rainbow(6), width=5, cex=1.5)
139-
densiTree(x=trees.ultra, direction="upwards", scaleX=TRUE, width=5)
140-
densiTree(x=trees.ultra, scaleX=TRUE, width=5, cex=1.5)
141-
densiTree(x=trees.ultra[1:10], scaleX=TRUE, width=5, cex=1.25)
141+
densiTree(x = trees.ultra, scaleX = TRUE, col = rainbow(6), width = 5, cex = 1.5)
142+
densiTree(x = trees.ultra, direction = "upwards", scaleX = TRUE, width = 5)
143+
densiTree(x = trees.ultra, scaleX = TRUE, width = 5, cex = 1.5)
144+
densiTree(x = trees.ultra[1:10], scaleX = TRUE, width = 5, cex = 1.25)
142145
# See help page
143146
?phytools::densityTree
144147
# Plotting density trees
145-
densityTree(trees=c(tree.sp, tree.sp2), fix.depth=TRUE, lwd=4)
146-
# densityTree(trees=trees.ultra, fix.depth=TRUE, use.gradient=TRUE, alpha=0.5, lwd=4)
147-
# densityTree(trees=trees.ultra[1:3], fix.depth=TRUE, use.gradient=TRUE, alpha=0.5, lwd=4)
148-
# densityTree(trees=trees.ultra[c(2, 4, 6)], fix.depth=TRUE, use.gradient=TRUE, alpha=0.5, lwd=4)
149-
148+
densityTree(trees = c(tree.sp, tree.sp2), fix.depth = TRUE, lwd = 4)
149+
densityTree(trees = trees.ultra, fix.depth = TRUE, use.gradient = TRUE, alpha = 0.5, lwd = 4)
150+
# densityTree(trees = trees.ultra[1:3], fix.depth = TRUE, use.gradient = TRUE, alpha = 0.5, lwd = 4)
151+
# densityTree(trees = trees.ultra[c(2, 4, 6)], fix.depth = TRUE, use.gradient = TRUE, alpha = 0.5, lwd = 4)

0 commit comments

Comments
 (0)