knitr::opts_chunk$set(collapse = FALSE, comment = "#>", fig.align = 'center') optDEF <- knitr::opts_chunk$get()
Load packages
library(spHelper) library(spPlot) library(spMisc) library(plotly)
qplot_sp
, qplot_kSp
, and qplot_kSpFacets
knitr::opts_chunk$set(fig.width = 6, fig.align = 'center')
data(flu, package = "hyperSpec") qplot_sp(flu) qplot_kSp(flu) qplot_kSpFacets(flu)
qplot_sp(flu, Title = "Flu dataset", facets = TRUE) qplot_kSpFacets(flu, Title = "Flu dataset")
qplot_kSpFacets(flu, Title = "Flu dataset", normalize = 1) qplot_kSpFacets(flu, Title = "Flu dataset", normalize = FALSE) qplot_kSpFacets(flu, Title = "Flu dataset", normalize = -1) qplot_sp(flu, Title = "Flu dataset", normalize = 1)
flu$c2 <- as.factor(flu$c) # `qplot_sp` uses no fill by default p <- qplot_sp(flu, Title = "Flu dataset", names.in = 'c2') # Otherwise set parameter `filled = FALSE` p <- qplot_kSp(flu, Title = "Flu dataset", names.in = 'c2', filled = FALSE) p
# No name qplot_kSp(flu, Title = "Flu dataset", names.in = 'c2', legendName = FALSE) # Automatic name qplot_kSp(flu, Title = "Flu dataset", names.in = 'c2', legendName = TRUE) qplot_kSp(flu, Title = "Flu dataset", names.in = 'c2', legendName = "Concentration")
plotly
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] qplot(carat, price, data = dsamp, colour = clarity) %>% ggplotly()
data(Loadings2) qplot_kSpFacets(Loadings2) # ggplotly()
qplot_kAmp
and qplot_scores
data(Scores2) qplot_kAmp(Scores2) qplot_scores(Scores2) qplot_kAmp(Scores2, by = "class") p <- qplot_scores(Scores2, add.jitter = TRUE) p p + theme_bw()
qplot_spStat
- Plot Summary Statistic of Spactraqplot_spStat(chondro,"clusters",mean) qplot_spStat(chondro,"clusters",mean,All = FALSE) qplot_spStat(chondro,"clusters",mean_sd,All = FALSE) + facet_grid(.~clusters) + nTick_x() qplot_spStat(chondro,"clusters",median,All = FALSE, fixed.colors = FALSE) qplot_spStat(chondro,"clusters",median, "My Title") qplot_spStat(chondro,"clusters",mean_pm_sd) + facet_grid(.~clusters) + nTick_x()
Examples with the other dataset
qplot_spStat(Spectra2,"gr",mean) qplot_spStat(Spectra2,"gr",mean,All = FALSE) qplot_spStat(Spectra2,"gr",mean_sd,All = FALSE) + facet_grid(.~gr) + nTick_x() qplot_spStat(Spectra2,"gr",median,All = FALSE, fixed.colors = FALSE) qplot_spStat(Spectra2,"gr",median, "My Title") qplot_spStat(Spectra2,"gr",mean_pm_sd) + facet_grid(.~gr) + nTick_x()
center_subtracted_centers
Function calculates centers (i.e., means, medians) for each indicated group. Then common center (e.g., a center of all data, a balanced center of all data, a center of certain group or a known spectrum) is subtracted from group centers.
In this context, a \emph{center} is a mean, a median or similar statistic, calculated at each wavelangth.
# === Common center of all spectra as the subtracted center ================ CSCs <- center_subtracted_centers(sp = Spectra2, by = "gr") # ggplot2 type plot -------------------------------------------------------- qplot_sp(CSCs, by = "gr") + ggtitle("CSCs - center subtracted centers") # R base type plot --------------------------------------------------------- names <- CSCs$gr plotspc(CSCs, col = names) legend("topright", lty = 1, col = names, legend = names, bty = "n") title("CSCs - center subtracted centers") # === Center of a certain group as the subtracted center =================== center_subtracted_centers(Spectra2, "gr", Center = "A") %>% qplot_sp(by = "gr") + ggtitle("Subtraced center is center of group 'A'") center_subtracted_centers(Spectra2, "gr", Center = "C") %>% qplot_sp(names.in = "gr")+ ggtitle("Subtraced center is center of group 'C'") # === Balanced center as the subtracted center ============================= center_subtracted_centers(Spectra2, "gr", balanced = TRUE) %>% qplot_sp(names.in = "gr")+ ggtitle(subt("Balanced center subtraced centers (BCSCs)", "Balanced = a mean of all group centers\n" %++% "Balanced center is mean")) center_subtracted_centers(Spectra2, "gr", balanced = TRUE, balance.FUN = median) %>% qplot_sp(names.in = "gr") + ggtitle(subt("Balanced center subtraced centers (BCSCs)", "Balanced center is median")) # === Scaled data ========================================================== MED <- apply(Spectra2,2,median) MAD <- apply(Spectra2,2,mad) # median absolute deviation scale(Spectra2,center = MED, scale = MAD) %>% center_subtracted_centers(by = "gr") %>% qplot_sp(names.in = "gr") + ggtitle(subt("CSCs of scaled data","Scaling: x = (x-median)/MAD")) scale(Spectra2,center = MED, scale = MAD) %>% center_subtracted_centers(by = "gr", balanced = TRUE, balance.FUN = median) %>% qplot_sp(names.in = "gr") + ggtitle(subt("Balanced median SCs of scaled data", "Scaling: x = (x-median)/MAD")) # === Add curves of common & balanced central tendencies ================= center_subtracted_centers(Spectra2, "gr", show.balanced = TRUE, show.all = TRUE) %>% qplot_sp(names.in = "gr") + ggtitle(subt("Curves of common & balanced centers added", "Imbalanced center subtracted centers")) center_subtracted_centers(Spectra2, "gr", balanced = TRUE, show.balanced = TRUE, show.all = TRUE) %>% qplot_sp(names.in = "gr")+ ggtitle(subt("Curves of common & balanced centers added", "Balanced center subtracted centers")) center_subtracted_centers(Spectra2, "gr", Center = "C", show.balanced = TRUE, show.all = TRUE) %>% qplot_sp(names.in = "gr")+ ggtitle(subt("Curves of common & balanced centers added", "Group 'C' center subtracted centers"))
qplot_proximity
and qplot_prediction
hyperSpec
objectclear() data(Scores2) Scores2$Prediction <- sample(Scores2$gr) Scores2 <- hyAdd_color(sp = Scores2, by = "gr", palette = c("tan3", "green4","skyblue")) qplot_prediction(Scores2,Prediction = "Prediction", Reference = "gr") qplot_prediction(Scores2,Prediction = "Prediction", Reference = "gr", type = "ref") qplot_prediction(Scores2,"Prediction","gr", type.stat = "ref", MDS = "isoMDS")
Taking a smaller number of variables, which are not noise, may lead to better discrimination of groups.
sc <- Scores2[,,c(1,3),wl.index = TRUE] qplot_prediction(sc,"Prediction","gr", type = "reference") qplot_prediction(sc,"Prediction","gr", type = "prediction") qplot_prediction(sc,"Prediction","gr", type = "prediction", type.stat = "ref") qplot_prediction(sc,"Prediction","gr", type = "prediction", type.stat = "ref", stat = "ellipse")
In proximity plots qplot_proximity
only one grouping variable is needed:
set.seed(1) sc <- sample(Scores2[,,c(1,2),wl.index = TRUE],50) sc <- hyAdd_color(sp = sc , by = "class", palette = c("tan3", "green4","skyblue","violet")) ID <- rownames(sc) qplot_proximity(sc, "class") qplot_proximity(sc, "class", plot.scatter = FALSE) + geom_text(aes(label = ID))
Plotting extra information
Clusters <- as.factor(kmeans(sc,3)$cluster) qplot_proximity(sc, "class", stat = FALSE) + stat_chull(aes(fill = Clusters), color = NA, alpha = .2)
qplot_crosstab
# Generate data: Random guess ============================ N <- 1000 # number of observations Prediction <- sample(c("A","B","C","D"), N, replace = TRUE) Reference <- sample(c("A", "B","C","D","E"),N, replace = TRUE) tabl <- table(Prediction,Reference) qplot_crosstab(tabl) qplot_crosstab_sort(tabl,subTitle = "Columns and rows sorted by the best match") # different order of columns and rows qplot_crosstab0(tabl,subTitle = "Without highlighting") # no colors qplot_crosstab0s(tabl,subTitle = "Sorted by the best match, no highlighting") # no colors, different order of columns and rows
qplot_confusion
# knitr::opts_chunk$set(optDEF) # knitr::opts_chunk$set(fig.width = 5, fig.show = "hold") knitr::opts_chunk$set(fig.width = 5)
d <- 5 # number of rows/columns Mat <- matrix(sample(0:100,d ^ 2,T),d) colnames(Mat) <- paste0("gr",1:d) rownames(Mat) <- colnames(Mat) class(Mat) qplot_confusion(Mat, subTitle = "Input is a matrix (1)") diag(Mat)[2:3] <- c(1000,250) qplot_confusion(Mat, subTitle = "Input is a matrix (2)", TPR.name = "<Sensitivity>") qplot_confusion(Mat, subTitle = "Input is a matrix (3) diagonal values sorted ", sort = "diagonal")
set.seed(165) N <- 1000 # number of observations Prediction <- sample(c("A","B","C","D"),N, replace = TRUE) Reference <- sample(c("A", "B","C","D"),N, replace = TRUE) qplot_confusion(Prediction, Reference, subTitle = "Correct by chance (inputs are two vectors)") # Random guess ===================== conf <- table(Prediction,Reference) class(conf) qplot_confusion(conf, subTitle = "Correct by chance (input is 'table')") # At least 40% of the cases agree ===================== ind2 <- sample(1:N,round(N*.50)) Reference[ind2] <- Prediction[ind2] conf2 <- table(Prediction,Reference) qplot_confusion(conf2, subTitle = "Correct >50%") # Most of the cases agree ============================= ind3 <- sample(1:N,round(N*.80)) Reference[ind3] <- Prediction[ind3] conf3 <- table(Prediction,Reference) qplot_confusion(conf3, subTitle = "Correct >80%") qplot_confusion(conf3, subTitle = "Correct >80%", metric = "weighted.kappa") qplot_confusion(conf3, subTitle = "Correct >80%", metric = "meanTPR")
# Sort rows and columns by the best match ============ conf3_sorted <- sort_descOnDiag(conf2) qplot_confusion(conf3_sorted, subTitle = "Columns and rows sorted by the best match")
# Proportions ========================================= qplot_confusion(conf3 , subTitle = "Counts") qplot_confusion(prop.table(conf3), subTitle = "Proportions (total sum = 1)")
# Shades: proportional ================================ qplot_confusion(conf,shades = "prop", subTitle = "Shades: 'prop', Correct by chance"); qplot_confusion(conf,shades = "max", subTitle = "Shades: 'max', Correct by chance") qplot_confusion(conf2,shades = "prop", subTitle = "Shades: 'prop', Correct >50%"); qplot_confusion(conf2,shades = "max", subTitle = "Shades: 'max', Correct >50%") qplot_confusion(conf3,shades = "prop", subTitle = "Shades: 'prop', Correct >80%"); qplot_confusion(conf3,shades = "max", subTitle = "Shades: 'max', Correct >80%")
# Shades: constant and none =========================== qplot_confusion(conf3,shades = "const",subTitle = "Shades: constant"); qplot_confusion(conf3,shades = "none", subTitle = "Shades: none")
n <- round(N/6) Prediction[sample(which(Prediction == "A"),n,replace = TRUE)] <- sample(c("B","C"), n,replace = TRUE) conf4 <- table(Prediction,Reference) qplot_confusion(conf4, subTitle = "Imbalanced class proportions")
infoDim
, qplot_infoDim
and qplot_screeplot
knitr::opts_chunk$set(fig.width = 6, fig.show = "asis")
# Example 1 ============================================================= my_matrix <- matrix(rexp(2000, rate = .1), ncol = 20) my_result <- infoDim(my_matrix) # Investigate the result str(my_result) my_result$exactDim my_result$dim #Plot qplot_screeplot(my_result) # Object of class "infoDim" qplot_screeplot(my_matrix) # Object of class "matrix" qplot_infoDim(my_matrix) # Example 2 ============================================================= p1 <- qplot_infoDim(Spectra2) # Object of class "hyperSpec" p1 # Possition of a legend changes, if theme applied in this way: p1 + theme_grey() # A better way to use non-default theme: p2 <- qplot_infoDim(Spectra2, ggtheme = theme_grey()) p2 # Numbes of selected components can be indicated p3 <- qplot_infoDim(Spectra2, selected = 4) p3 # ggplotly(p3)
# Numbes of selected components can be indicated p4 <- qplot_infoDim(Spectra2, y.log = FALSE) p4 # ggplotly(p4)
unipeak
- Transform Spectra of Components# Example 1 ------------------------------------------------------- x <- seq(-10,20,.1) y0 <- GaussAmp(x, c = 0, A = 1) + GaussAmp(x, c = 10, A = 2) - .5 y0NEW <- unipeak(y0) # Plot the results par(mfrow = c(1,1)) plot( x, y0, type = "l", lty = 3, main = "'unipeak' keeps positive part \n of highest peak only" ); lines(x, y0NEW, type = "l", lty = 1, lwd = 3); legend("topleft", legend = c("Before","After"), lty = c(3,1))
# Example 2 ------------------------------------------------------- x = seq(-10,20,.1) y1 = (sin(x/4) + GaussAmp(x)) y2 = (2*sin(x) + sin(x/5) + GaussAmp(x, c = 5)) y = base::rbind(y1,y2) yNEW <- apply(y,1,unipeak) par(mfrow = c(3,1)) # plot 1 matplot(x, t(y), type = "l", lty = 3, main = "A - Initial curves"); abline(h = 0) # plot 2 matplot(x,yNEW, type = "l", lty = 1,lwd = 3, main = "B - Only the highest positive\n peaks per curve"); abline(h = 0) # plot 3: both plots together matplot(x, t(y), type = "l", lty = 3, main = "A and B together"); matlines(x,yNEW, type = "l", lty = 1,lwd = 3); abline(h = 0) par(mfrow = c(1,1))
subt
- Title and Subtitlesubt("Cars") ## bold("Cars") subt("Cars","Distance vs. speed") ## atop(bold("Cars"), atop(italic("Distance vs. speed"))) # ---------------------------------------------------------------- plot(cars[,1:2], main = "Cars") plot(cars[,1:2], main = subt("Cars")) # the same as in previous line plot(cars[,1:2], main = subt("Cars","Distance vs. speed")) plot(cars[,1:2], main = subt(subTitle = "Distance vs. speed")) # ---------------------------------------------------------------- library(ggplot2) g <- qplot(mpg, wt, data = mtcars) g + ggtitle("Cars") # non-bold title g + ggtitle(subt("Cars")) # bold title g + ggtitle(subt("Cars","Distance vs. speed")) g + ggtitle(subt(subTitle = "Distance vs. speed")) # ---------------------------------------------------------------- library(lattice) xyplot(eruptions~waiting, data = faithful) xyplot(eruptions~waiting, data = faithful, main = "Old Faithful Geyser Data") xyplot(eruptions~waiting, data = faithful, main = subt("Old Faithful Geyser Data")) xyplot(eruptions~waiting, data = faithful, main = subt("Old Faithful Geyser", "Data")) xyplot(eruptions~waiting, data = faithful, main = subt(subTitle = "Old Faithful Geyser Data"))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.