rm(list = ls())
data(iris)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(grid)
library(gridExtra)
##
## Attaching package: 'gridExtra'
##
## The following object is masked from 'package:dplyr':
##
## combine
library(RColorBrewer)
library(MASS)
##
## Attaching package: 'MASS'
##
## The following object is masked from 'package:dplyr':
##
## select
plot(iris)

#flower data experiment
n <- iris %>% ncol() #counting the number of columns
angle <- 360 / n #using the number of columns to figure out what angle is needed to make it symmetrical
updated_angle <- angle
distance <- 0.9 #distance from the center
rise <- sin(angle) * distance
run <- cos(angle) * distance
size <- 0.3
x_position <- 0.5
y_position <- 0.5
grid.newpage() #creating a page for the plots to go on
#initalialzing the viewport
#mostly specifying it's size
viewport(x = x_position, y = y_position,
width = size, height = size) %>%
pushViewport()
palette_name <- "Set1"
color_scheme <- brewer.pal(n, palette_name)
i <- 1
for(name in names(iris)) {
#viewport for angle
viewport(angle = updated_angle - angle,
#x = x_position, #+ run,
#y = y_position, #+ rise,
just = c("center", "bottom")
) %>%
pushViewport()
p <- ggplot(data = iris, aes_string(x = name)) +
geom_bar(width = 0.01,
fill = color_scheme[i]
) +
#geom_point(fill = color_scheme[i]) +
theme_void() +
geom_hline(yintercept = 0,
color = color_scheme[i])
#viewport for distance
viewport(#angle = updated_angle,
#x = x_position, #+ run,
#y = y_position, #+ rise,
y = 0.7,
just = c("center", "bottom")
) %>%
pushViewport()
g <- ggplotGrob(p)
#grid.rect(gp = gpar(fill = NA))
#grid.points(x = 0.5, y = 0)
grid.draw(g)
popViewport(2)
updated_angle <- (updated_angle + angle) %% 360
rise <- -rise #+ sin(updated_angle) * distance
run <- -run #+ cos(updated_angle) * distance
i <- i + 1
#if(i==3) break
}
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning in grid.Call.graphics(C_setviewport, vp, TRUE): cannot clip to rotated
## viewport
## Warning in grid.Call.graphics(C_setviewport, vp, TRUE): cannot clip to rotated
## viewport
## Warning in grid.Call.graphics(C_setviewport, vp, TRUE): cannot clip to rotated
## viewport
## Warning in grid.Call.graphics(C_setviewport, vp, TRUE): cannot clip to rotated
## viewport

vector_rotation <- function(x, y, theta) {
x_prime <- 6
}
opacity <- 0.50
size <- 0.3
ggplot() +
geom_bar(data = tibble(x = iris$Petal.Width), aes(x = x),
alpha = opacity, fill = "blue1") +
geom_bar(data = tibble(x = iris$Petal.Length), aes(x = x),
alpha = opacity, fill = "blue4") +
geom_bar(data = tibble(x = iris$Sepal.Width), aes(x = x),
alpha = opacity) +
geom_bar(data = tibble(x = iris$Sepal.Length), aes(x = x),
alpha = opacity) +
theme_void() #+

#coord_polar()
opacity <- 0.50
size <- 0.3
grid.newpage()
p <- ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) +
geom_point(alpha = opacity, color = "blue4", size = 1) +
geom_smooth(method = "lm", se = F, size = 0.3, linetype = 1, color = "blue4") +
theme_void()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
g <- ggplotGrob(p)
## `geom_smooth()` using formula = 'y ~ x'
viewport(
width = size, height = size
) %>% pushViewport()
grid.draw(g)

grid.newpage()
grid.rect(gp = gpar(fill = "grey20"))
model <- lm(Sepal.Width ~ Sepal.Length, data = iris)
size <- summary(model)$adj.r.squared * 100
summary(model)$adj.r.squared %>% print()
## [1] 0.007159294
size %>% print()
## [1] 0.7159294
iris$resid_lm <- resid(model)
p <- ggplot(iris, aes(x = Sepal.Length, y = resid_lm)) +
geom_point(alpha = opacity, color = "blue1", size = 1) +
#geom_vline(xintercept = 0) +
geom_hline(yintercept = 0, linetype = 1, color = "blue1", alpha = 0.5, size = 0.5) +
geom_smooth(method = "lm", formula = y ~ poly(x, 5),
se = F, linetype = 1, color = "blue1", size = 0.3) +
geom_smooth(method = "lm", formula = y ~ poly(x, 10),
se = F, linetype = 1, color = "blue1", size = 0.1) +
coord_polar() +
theme_void()
viewport(
x = 0.25,
width = size, height = size,
) %>% pushViewport()
g <- ggplotGrob(p)
grid.draw(g)
model <- lm(Sepal.Width ~ Petal.Length, data = iris)
size <- summary(model)$adj.r.squared * 100 / 17
summary(model)$adj.r.squared %>% print()
## [1] 0.1780444
size %>% print()
## [1] 1.04732
iris$resid_lm <- resid(model)
p <- ggplot(iris, aes(x = Sepal.Length, y = resid_lm)) +
geom_point(alpha = opacity, color = "red4", size = 1) +
#geom_vline(xintercept = 0) +
geom_hline(yintercept = 0, linetype = 1, color = "red4", alpha = 0.5, size = 0.5) +
geom_smooth(method = "lm", formula = y ~ poly(x, 5),
se = F, linetype = 1, color = "red4", size = 0.3) +
geom_smooth(method = "lm", formula = y ~ poly(x, 10),
se = F, linetype = 1, color = "red4", size = 0.1) +
coord_polar() +
theme_void()
popViewport(1)
viewport(
x = 0.75,
width = size, height = size,
) %>% pushViewport()
g <- ggplotGrob(p)
grid.draw(g)

#systematic way of making what's above
for(col in names(iris)) {
col %>% print()
ggplot()
}
## [1] "Sepal.Length"
## [1] "Sepal.Width"
## [1] "Petal.Length"
## [1] "Petal.Width"
## [1] "Species"
## [1] "resid_lm"
#colors()
grid.newpage()
p <- ggplot(iris, aes(x = Sepal.Length, y = resid_lm)) +
geom_point(color = "grey20") +
#theme_void() +
#coord_cartesian(ylim = c(-0.5, 0.5)) +
coord_polar() +
scale_y_continuous(limits = c(-0.5, 0.5))
g <- ggplotGrob(p)
## Warning: Removed 29 rows containing missing values or values outside the scale range
## (`geom_point()`).
viewport() %>% pushViewport()
grid.draw(g)

model_lm <- lm(Sepal.Width ~ Sepal.Length, data = iris)
iris$resid_lm <- model_lm %>% resid()
model3 <- lm(Sepal.Width ~ poly(Sepal.Length, 3), data = iris)
iris$resid3 <- model3 %>% resid()
model9 <- lm(Sepal.Width ~ poly(Sepal.Length, 9), data = iris)
iris$resid9 <- model9 %>% resid()
model12 <- lm(Sepal.Width ~ poly(Sepal.Length, 12), data = iris)
iris$resid12 <- model12 %>% resid()
model16 <- lm(Sepal.Width ~ poly(Sepal.Length, 16), data = iris)
iris$resid16 <- model16 %>% resid()
#for safe keeping, maybe I'll use it later
#model.complexities <- list(model_lm, model3, model9, model12, model16)
iris.resids <- iris %>% dplyr::select(contains("resid"))
grid.newpage()
grid.rect(gp = gpar(fill = "grey20"))
opacity <- 0.8
opac_drop <- 1 / (length(iris.resids) + 1)
#color_scheme <- c("blue", "lightsteelblue", "bisque1", "orange2", "red3")
i <- 1
first <- T
for(res in names(iris.resids)) {
print(res)
if(first) {
"first" %>% print()
p <- ggplot(iris, aes(x = Sepal.Length, y = .data[[res]])) +
geom_point(color = "grey90", alpha = opacity) +
theme_void() +
coord_polar()
built <- ggplot_build(p)
y.low <- built$layout$panel_params[[1]]$y.range[1]
y.high <- built$layout$panel_params[[1]]$y.range[2]
first <- F
} else {
"else" %>% print()
p <- ggplot(iris, aes(x = Sepal.Length, y = .data[[res]])) +
geom_point(color = "grey90", alpha = opacity) +
theme_void() +
coord_polar() +
scale_y_continuous(limits = c(y.low, y.high))
}
g <- ggplotGrob(p)
viewport() %>% pushViewport()
grid.draw(g)
opacity <- opacity - opac_drop
i <- i + 1
#break()
}

## [1] "resid_lm"
## [1] "first"
## [1] "resid3"
## [1] "else"
## [1] "resid9"
## [1] "else"
## [1] "resid12"
## [1] "else"
## [1] "resid16"
## [1] "else"
data(iris)
iris
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## 11 5.4 3.7 1.5 0.2 setosa
## 12 4.8 3.4 1.6 0.2 setosa
## 13 4.8 3.0 1.4 0.1 setosa
## 14 4.3 3.0 1.1 0.1 setosa
## 15 5.8 4.0 1.2 0.2 setosa
## 16 5.7 4.4 1.5 0.4 setosa
## 17 5.4 3.9 1.3 0.4 setosa
## 18 5.1 3.5 1.4 0.3 setosa
## 19 5.7 3.8 1.7 0.3 setosa
## 20 5.1 3.8 1.5 0.3 setosa
## 21 5.4 3.4 1.7 0.2 setosa
## 22 5.1 3.7 1.5 0.4 setosa
## 23 4.6 3.6 1.0 0.2 setosa
## 24 5.1 3.3 1.7 0.5 setosa
## 25 4.8 3.4 1.9 0.2 setosa
## 26 5.0 3.0 1.6 0.2 setosa
## 27 5.0 3.4 1.6 0.4 setosa
## 28 5.2 3.5 1.5 0.2 setosa
## 29 5.2 3.4 1.4 0.2 setosa
## 30 4.7 3.2 1.6 0.2 setosa
## 31 4.8 3.1 1.6 0.2 setosa
## 32 5.4 3.4 1.5 0.4 setosa
## 33 5.2 4.1 1.5 0.1 setosa
## 34 5.5 4.2 1.4 0.2 setosa
## 35 4.9 3.1 1.5 0.2 setosa
## 36 5.0 3.2 1.2 0.2 setosa
## 37 5.5 3.5 1.3 0.2 setosa
## 38 4.9 3.6 1.4 0.1 setosa
## 39 4.4 3.0 1.3 0.2 setosa
## 40 5.1 3.4 1.5 0.2 setosa
## 41 5.0 3.5 1.3 0.3 setosa
## 42 4.5 2.3 1.3 0.3 setosa
## 43 4.4 3.2 1.3 0.2 setosa
## 44 5.0 3.5 1.6 0.6 setosa
## 45 5.1 3.8 1.9 0.4 setosa
## 46 4.8 3.0 1.4 0.3 setosa
## 47 5.1 3.8 1.6 0.2 setosa
## 48 4.6 3.2 1.4 0.2 setosa
## 49 5.3 3.7 1.5 0.2 setosa
## 50 5.0 3.3 1.4 0.2 setosa
## 51 7.0 3.2 4.7 1.4 versicolor
## 52 6.4 3.2 4.5 1.5 versicolor
## 53 6.9 3.1 4.9 1.5 versicolor
## 54 5.5 2.3 4.0 1.3 versicolor
## 55 6.5 2.8 4.6 1.5 versicolor
## 56 5.7 2.8 4.5 1.3 versicolor
## 57 6.3 3.3 4.7 1.6 versicolor
## 58 4.9 2.4 3.3 1.0 versicolor
## 59 6.6 2.9 4.6 1.3 versicolor
## 60 5.2 2.7 3.9 1.4 versicolor
## 61 5.0 2.0 3.5 1.0 versicolor
## 62 5.9 3.0 4.2 1.5 versicolor
## 63 6.0 2.2 4.0 1.0 versicolor
## 64 6.1 2.9 4.7 1.4 versicolor
## 65 5.6 2.9 3.6 1.3 versicolor
## 66 6.7 3.1 4.4 1.4 versicolor
## 67 5.6 3.0 4.5 1.5 versicolor
## 68 5.8 2.7 4.1 1.0 versicolor
## 69 6.2 2.2 4.5 1.5 versicolor
## 70 5.6 2.5 3.9 1.1 versicolor
## 71 5.9 3.2 4.8 1.8 versicolor
## 72 6.1 2.8 4.0 1.3 versicolor
## 73 6.3 2.5 4.9 1.5 versicolor
## 74 6.1 2.8 4.7 1.2 versicolor
## 75 6.4 2.9 4.3 1.3 versicolor
## 76 6.6 3.0 4.4 1.4 versicolor
## 77 6.8 2.8 4.8 1.4 versicolor
## 78 6.7 3.0 5.0 1.7 versicolor
## 79 6.0 2.9 4.5 1.5 versicolor
## 80 5.7 2.6 3.5 1.0 versicolor
## 81 5.5 2.4 3.8 1.1 versicolor
## 82 5.5 2.4 3.7 1.0 versicolor
## 83 5.8 2.7 3.9 1.2 versicolor
## 84 6.0 2.7 5.1 1.6 versicolor
## 85 5.4 3.0 4.5 1.5 versicolor
## 86 6.0 3.4 4.5 1.6 versicolor
## 87 6.7 3.1 4.7 1.5 versicolor
## 88 6.3 2.3 4.4 1.3 versicolor
## 89 5.6 3.0 4.1 1.3 versicolor
## 90 5.5 2.5 4.0 1.3 versicolor
## 91 5.5 2.6 4.4 1.2 versicolor
## 92 6.1 3.0 4.6 1.4 versicolor
## 93 5.8 2.6 4.0 1.2 versicolor
## 94 5.0 2.3 3.3 1.0 versicolor
## 95 5.6 2.7 4.2 1.3 versicolor
## 96 5.7 3.0 4.2 1.2 versicolor
## 97 5.7 2.9 4.2 1.3 versicolor
## 98 6.2 2.9 4.3 1.3 versicolor
## 99 5.1 2.5 3.0 1.1 versicolor
## 100 5.7 2.8 4.1 1.3 versicolor
## 101 6.3 3.3 6.0 2.5 virginica
## 102 5.8 2.7 5.1 1.9 virginica
## 103 7.1 3.0 5.9 2.1 virginica
## 104 6.3 2.9 5.6 1.8 virginica
## 105 6.5 3.0 5.8 2.2 virginica
## 106 7.6 3.0 6.6 2.1 virginica
## 107 4.9 2.5 4.5 1.7 virginica
## 108 7.3 2.9 6.3 1.8 virginica
## 109 6.7 2.5 5.8 1.8 virginica
## 110 7.2 3.6 6.1 2.5 virginica
## 111 6.5 3.2 5.1 2.0 virginica
## 112 6.4 2.7 5.3 1.9 virginica
## 113 6.8 3.0 5.5 2.1 virginica
## 114 5.7 2.5 5.0 2.0 virginica
## 115 5.8 2.8 5.1 2.4 virginica
## 116 6.4 3.2 5.3 2.3 virginica
## 117 6.5 3.0 5.5 1.8 virginica
## 118 7.7 3.8 6.7 2.2 virginica
## 119 7.7 2.6 6.9 2.3 virginica
## 120 6.0 2.2 5.0 1.5 virginica
## 121 6.9 3.2 5.7 2.3 virginica
## 122 5.6 2.8 4.9 2.0 virginica
## 123 7.7 2.8 6.7 2.0 virginica
## 124 6.3 2.7 4.9 1.8 virginica
## 125 6.7 3.3 5.7 2.1 virginica
## 126 7.2 3.2 6.0 1.8 virginica
## 127 6.2 2.8 4.8 1.8 virginica
## 128 6.1 3.0 4.9 1.8 virginica
## 129 6.4 2.8 5.6 2.1 virginica
## 130 7.2 3.0 5.8 1.6 virginica
## 131 7.4 2.8 6.1 1.9 virginica
## 132 7.9 3.8 6.4 2.0 virginica
## 133 6.4 2.8 5.6 2.2 virginica
## 134 6.3 2.8 5.1 1.5 virginica
## 135 6.1 2.6 5.6 1.4 virginica
## 136 7.7 3.0 6.1 2.3 virginica
## 137 6.3 3.4 5.6 2.4 virginica
## 138 6.4 3.1 5.5 1.8 virginica
## 139 6.0 3.0 4.8 1.8 virginica
## 140 6.9 3.1 5.4 2.1 virginica
## 141 6.7 3.1 5.6 2.4 virginica
## 142 6.9 3.1 5.1 2.3 virginica
## 143 5.8 2.7 5.1 1.9 virginica
## 144 6.8 3.2 5.9 2.3 virginica
## 145 6.7 3.3 5.7 2.5 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3.0 5.1 1.8 virginica
circle_dot_reg <- function(df, predictor, degrees = c(1, 3, 9, 12, 16)) {
#pulling the vector
if(predictor %>% is.character() && length(predictor) == 1 && predictor %in% names(df)) {
predictor.vec <- df[[predictor]]
df[[predictor]] <- NULL
predictor <- predictor.vec
}
init_len <- length(df)
n <- init_len - (init_len %% 2)
nf <- n %>% sqrt() %>% floor()
nc <- n %>% sqrt() %>% ceiling()
size_each <- min(1/(nc + (init_len %% 2)), 1/nf) #size of each plot
j <- 1
grid.newpage()
grid.rect(gp = gpar(fill = "grey20"))
#iterating through the columns
for(col_name in names(df)) {
col_name %>% print()
viewport(
width = size_each, height = size_each,
x = size_each*j - 1, y = 1,
just = c("left", "top")
) %>% pushViewport()
response <- df[[col_name]]
if(predictor %>% is.character()){
for(num in degrees) {
model <- glm(response ~ predictor, family = binomial)
df[[paste0("resid", num)]] <- model %>% resid()
}
}
if(predictor %>% is.numeric()) {
for(num in degrees) {
model <- lm(response ~ poly(predictor, num))
df[[paste0("resid", num)]] <- model %>% resid()
}
}
df.resids <- df %>% dplyr::select(init_len:length(df))
df.resids$predictor <- predictor
opacity <- 0.8
opac_drop <- opacity / (length(df.resids) + 1)
#iterating through residuals
i <- 1
first <- T
for(res in names(df.resids)) {
if(first) {
p <- ggplot(df.resids, aes(x = predictor, y = .data[[res]])) +
geom_point(color = "grey90", alpha = opacity) +
theme_void() +
coord_polar()
built <- ggplot_build(p)
y.low <- built$layout$panel_params[[1]]$y.range[1]
y.high <- built$layout$panel_params[[1]]$y.range[2]
first <- F
} else {
"else" %>% print()
p <- ggplot(df.resids, aes(x = predictor, y = .data[[res]])) +
geom_point(color = "grey90", alpha = opacity) +
theme_void() +
coord_polar() +
scale_y_continuous(limits = c(y.low, y.high))
}
g <- ggplotGrob(p)
grid.draw(g)
opacity <- opacity - opac_drop
i <- i + 1
if(i > 1) break()
}
j <- j + 1
popViewport(1)
#break()
}
}
iris %>% circle_dot_reg("Petal.Width")
## [1] "Sepal.Length"
## Warning: Using an external vector in selections was deprecated in tidyselect 1.1.0.
## ℹ Please use `all_of()` or `any_of()` instead.
## # Was:
## data %>% select(init_len)
##
## # Now:
## data %>% select(all_of(init_len))
##
## See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## [1] "Sepal.Width"
## [1] "Petal.Length"
## [1] "Species"
## Warning in model.response(mf, "numeric"): using type = "numeric" with a factor
## response will be ignored
## Warning in Ops.factor(y, z$residuals): '-' not meaningful for factors
## Warning in model.response(mf, "numeric"): using type = "numeric" with a factor
## response will be ignored
## Warning in Ops.factor(y, z$residuals): '-' not meaningful for factors
## Warning in model.response(mf, "numeric"): using type = "numeric" with a factor
## response will be ignored
## Warning in Ops.factor(y, z$residuals): '-' not meaningful for factors
## Warning in model.response(mf, "numeric"): using type = "numeric" with a factor
## response will be ignored
## Warning in Ops.factor(y, z$residuals): '-' not meaningful for factors
## Warning in model.response(mf, "numeric"): using type = "numeric" with a factor
## response will be ignored
## Warning in Ops.factor(y, z$residuals): '-' not meaningful for factors

#lets just see if we can draw a box or something like that next to each other
grid.newpage()
p <- ggplot()
g <- ggplotGrob(p)
viewport(
width = 0.5, height = 0.5,
just = c("left", "top"),
x = 0, y = 1
#gp = gpar(fill = "black")
) %>% pushViewport()
grid.draw(g)
popViewport(1)
viewport(
width = 0.5, height = 0.5,
just = c("left", "top"),
x = 0.5, y = 1
#gp = gpar(fill = "black")
) %>% pushViewport()
grid.draw(g)
