Michael Friendly's Avatar

Michael Friendly

@datavisfriendly.bsky.social

ASA Fellow; #rstats developer of graphical methods for categorical and multivariate data; #datavis history of data visualization; #historicaldatavis; Milestones project Web: www.datavis.ca GitHub: github.com/friendly

6,007 Followers  |  447 Following  |  2,088 Posts  |  Joined: 20.07.2023
Posts Following

Posts by Michael Friendly (@datavisfriendly.bsky.social)

Post image 04.03.2026 18:57 β€” πŸ‘ 36    πŸ” 22    πŸ’¬ 3    πŸ“Œ 2

Hard to believe CRAN accepted a package with such a similar name to the widely used 'colorspace' πŸ“¦

05.03.2026 02:21 β€” πŸ‘ 10    πŸ” 2    πŸ’¬ 3    πŸ“Œ 0
B/W photo of Alban William Housego Phillips

B/W photo of Alban William Housego Phillips

Plot of the rate of change of wage rates on the Y axis vs. unemployment. The inverse relation suggest a tradeoff

Plot of the rate of change of wage rates on the Y axis vs. unemployment. The inverse relation suggest a tradeoff

The cyclic relationship becomes clearer when the points are connected in time order

The cyclic relationship becomes clearer when the points are connected in time order

#TodayinHistory #dataviz #Onthisday #OTD πŸ“Š
πŸ’€Mar 4, 1975 Alban William Housego Phillips died in Auckland, New Zealand πŸ‡³πŸ‡Ώ

1958: The "Phillips Curve,'' a scatterplot of inflation vs. unemployment over time shows a strong inverse relation, leading to important developments in macroeconomic theory

05.03.2026 02:16 β€” πŸ‘ 7    πŸ” 2    πŸ’¬ 0    πŸ“Œ 0
Preview
Credit Where Credit is Due: Mary Eleanor Spear Exploring the life and work of an overlooked mid-century dataviz pioneer who may have discovered the Box Plot 17 years before John Tukey.

#TodayinHistory #dataviz #Onthisday #OTD πŸ“Š
πŸŽ‚Mar 4, 1897 Mary Eleanor Spear born in Jonesboro, Indiana, USA πŸ‡ΊπŸ‡Έ

A data vis specialist at the Bureau of Labor Statistics, she pioneered the boxplot and wrote books on effective graphic techniques (done by hand!)
πŸ‘€ bit.ly/4baeFSY

05.03.2026 01:49 β€” πŸ‘ 8    πŸ” 2    πŸ’¬ 0    πŸ“Œ 0

WOW!

05.03.2026 01:06 β€” πŸ‘ 2    πŸ” 1    πŸ’¬ 0    πŸ“Œ 0

This is a great find!
1828-- Not long after Dupin published his first b/w choropleth (1826)
The use of color is subtle; uses what looks like a nice color ramp, but actually colored patterns. Great detail shown
I never heard of the cartographer -- F. von Doring

05.03.2026 00:58 β€” πŸ‘ 14    πŸ” 5    πŸ’¬ 0    πŸ“Œ 0

^0.5 --> ^0.57 makes a bigger difference than one would think.
But remember, you can't say much about what is "better" for #dataviz without specifying the TASK. A lot of the recommendations (following Cleveland/McGill) come from magnitude estimation: How big is X?

04.03.2026 01:51 β€” πŸ‘ 10    πŸ” 1    πŸ’¬ 0    πŸ“Œ 1
R.I.P., John Fox - Yihui Xie | θ°’η›ŠθΎ‰ Last November, I learned the very sad news from Michael Friendly that John Fox had passed away. That brought my memory back to 2006 when I emailed John for the first time asking for his help on a &hel...

#rstats RIP, John Fox
@yihui.org just published this lovely tribute to John Fox and his work

yihui.org/en/2026/02/j...

12.02.2026 02:05 β€” πŸ‘ 32    πŸ” 16    πŸ’¬ 1    πŸ“Œ 1

YES! Of course the Atlantic gave Minard a lot more room.
But his master stroke was to do these comparatively over time

04.03.2026 01:26 β€” πŸ‘ 12    πŸ” 5    πŸ’¬ 1    πŸ“Œ 0
Preview
A Few Claude Skills for R Users – R Works The community has come together to create some great Claude Skills that you can try out today.

I rounded up a few Claude Skills for #RStats users.

Huge thanks to the creators who developed them. They share Skills for everything from tidyverse code to brand.yml files to learning while using AI.

Hope the list is useful, and please let me know what I missed! 🧑

rworks.dev/posts/claude...

03.03.2026 14:05 β€” πŸ‘ 129    πŸ” 38    πŸ’¬ 4    πŸ“Œ 4
Wright's generic path diagram showing A as a cause of X, D as a cause of Y and B, C as partial causes of X and Y. (reproduced from Wright, 1920, p. 329)

Wright's generic path diagram showing A as a cause of X, D as a cause of Y and B, C as partial causes of X and Y. (reproduced from Wright, 1920, p. 329)

Photo of Sewall Wright in front of a blackboard with mathematical symbols

Photo of Sewall Wright in front of a blackboard with mathematical symbols

#TodayinHistory #dataviz #Onthisday #OTD πŸ“Š
πŸ’€Mar 3, 1988 Sewall Wright died in Madison, Wisconsin, USA πŸ‡ΊπŸ‡Έ
1920: invention of the path diagram to show relations among a network of endogenous and exogenous variables forming a system of structural equations.
Established idea of diagram thinking

04.03.2026 00:40 β€” πŸ‘ 15    πŸ” 5    πŸ’¬ 0    πŸ“Œ 0

Very nice collection. Bertin would love these

03.03.2026 03:42 β€” πŸ‘ 1    πŸ” 1    πŸ’¬ 0    πŸ“Œ 0

But people on all sides were finally thinking (and muttering) about their loyalties

03.03.2026 01:51 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

Be extra careful with the Description: -- quote software names, beware of spelling, use proper DOI refs, ...

"Newbies" -- packages, not maintainers are put through a special room in CRAN-Hell πŸ‘Ώ

02.03.2026 03:13 β€” πŸ‘ 0    πŸ” 1    πŸ’¬ 0    πŸ“Œ 0
Preview
R Birthday card generated by Claude Sonnet 4.6 R Birthday card generated by Claude Sonnet 4.6 . GitHub Gist: instantly share code, notes, and snippets.

Code for the R_birthday_card: gist.github.com/friendly/ca2...

02.03.2026 03:04 β€” πŸ‘ 0    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
R birthday cake generated by Claude Ai
Code:
# Happy Birthday, R!
# R 1.0.0 was first released on February 29, 2000
# Celebrating 26 years of statistical computing!

out_file <- "r_birthday_cake.png"
png(out_file, width = 800, height = 660, bg = "#FFF0F5")
par(mar = c(0.3, 0.3, 0.3, 0.3), bg = "#FFF0F5")
plot(0, 0, type = "n", xlim = c(0, 10), ylim = c(0, 10),
     axes = FALSE, xlab = "", ylab = "")
rect(-1, -1, 11, 11, col = "#FFF0F5", border = NA)

# ---- Helper: teardrop flame ----
draw_flame <- function(cx, base_y) {
  t <- seq(0, 2 * pi, length.out = 120)
  polygon(cx + 0.15 * sin(t),
          base_y + 0.32 * (1 - cos(t)) / 2,
          col = "#FFD93D", border = "#FFA500", lwd = 1)
  polygon(cx + 0.09 * sin(t),
          base_y + 0.02 + 0.20 * (1 - cos(t)) / 2,
          col = "#FF8C00", border = NA)
  polygon(cx + 0.04 * sin(t),
          base_y + 0.05 + 0.10 * (1 - cos(t)) / 2,
          col = "#FFFACD", border = NA)
}

# ---- Confetti scatter (top & bottom strips) ----
set.seed(2000)
confetti_cols <- c("#FF6B6B", "#FFD93D", "#6BCB77", "#4D96FF", "#C77DFF", "#FF9F43")
for (i in 1:90) {
  x  <- runif(1, 0.1, 9.9)
  y  <- ifelse(runif(1) > 0.5, runif(1, 0, 1.3), runif(1, 8.1, 9.9))
  col <- sample(confetti_cols, 1)
  points(x, y, pch = sample(c(15, 17, 18), 1),
         cex = runif(1, 0.5, 1.6),
         col = adjustcolor(col, alpha.f = 0.75))
}

# ---- Title text ----
text(5, 9.55, "Happy Birthday, R!",
     cex = 2.7, col = "#C0392B", font = 2, adj = 0.5)
text(5, 9.07, "February 29, 2000  \u2014  26 Years of Statistical Computing",
     cex = 0.92, col = "#7F8C8D", font = 3, adj = 0.5)

# ---- Cake plate (ellipse) ----
t_e <- seq(0, 2 * pi, length.out = 200)
polygon(5 + 3.7 * cos(t_e), 2.12 + 0.28 * sin(t_e),
        col = "#C8B89A", border = "#A8987A", lwd = 2)

# ---- Bottom cake layer ----
rect(1.65, 2.12, 8.35, 4.3, col = "#FADADD", border = "#E8A0A8", lwd = 2)
# 3-D right-side face
polygon(c(8.35, 8.65, 8.65, 8.35), c(2.12, 1.88, 4.05, 4.3),
        co…

R birthday cake generated by Claude Ai Code: # Happy Birthday, R! # R 1.0.0 was first released on February 29, 2000 # Celebrating 26 years of statistical computing! out_file <- "r_birthday_cake.png" png(out_file, width = 800, height = 660, bg = "#FFF0F5") par(mar = c(0.3, 0.3, 0.3, 0.3), bg = "#FFF0F5") plot(0, 0, type = "n", xlim = c(0, 10), ylim = c(0, 10), axes = FALSE, xlab = "", ylab = "") rect(-1, -1, 11, 11, col = "#FFF0F5", border = NA) # ---- Helper: teardrop flame ---- draw_flame <- function(cx, base_y) { t <- seq(0, 2 * pi, length.out = 120) polygon(cx + 0.15 * sin(t), base_y + 0.32 * (1 - cos(t)) / 2, col = "#FFD93D", border = "#FFA500", lwd = 1) polygon(cx + 0.09 * sin(t), base_y + 0.02 + 0.20 * (1 - cos(t)) / 2, col = "#FF8C00", border = NA) polygon(cx + 0.04 * sin(t), base_y + 0.05 + 0.10 * (1 - cos(t)) / 2, col = "#FFFACD", border = NA) } # ---- Confetti scatter (top & bottom strips) ---- set.seed(2000) confetti_cols <- c("#FF6B6B", "#FFD93D", "#6BCB77", "#4D96FF", "#C77DFF", "#FF9F43") for (i in 1:90) { x <- runif(1, 0.1, 9.9) y <- ifelse(runif(1) > 0.5, runif(1, 0, 1.3), runif(1, 8.1, 9.9)) col <- sample(confetti_cols, 1) points(x, y, pch = sample(c(15, 17, 18), 1), cex = runif(1, 0.5, 1.6), col = adjustcolor(col, alpha.f = 0.75)) } # ---- Title text ---- text(5, 9.55, "Happy Birthday, R!", cex = 2.7, col = "#C0392B", font = 2, adj = 0.5) text(5, 9.07, "February 29, 2000 \u2014 26 Years of Statistical Computing", cex = 0.92, col = "#7F8C8D", font = 3, adj = 0.5) # ---- Cake plate (ellipse) ---- t_e <- seq(0, 2 * pi, length.out = 200) polygon(5 + 3.7 * cos(t_e), 2.12 + 0.28 * sin(t_e), col = "#C8B89A", border = "#A8987A", lwd = 2) # ---- Bottom cake layer ---- rect(1.65, 2.12, 8.35, 4.3, col = "#FADADD", border = "#E8A0A8", lwd = 2) # 3-D right-side face polygon(c(8.35, 8.65, 8.65, 8.35), c(2.12, 1.88, 4.05, 4.3), co…

πŸŽ‚Happy #Rstats birthday!
OK, Claude. I hear your pain.

"You can have a turn at creating an #Rstats birthday card. But you've got to do that in R code. Nothing fancy-- use base R graphics and no pipes, data.tables, an no extra packages loaded".

02.03.2026 02:25 β€” πŸ‘ 8    πŸ” 0    πŸ’¬ 2    πŸ“Œ 0
A birthday card generated by Google Nano Banana from the prompt: "Can you make a birthday card or an image of a birthday cake for R software? R 1.0.0 was first released on February 29, 2000
[It gets the birthday WRONG.]

A birthday card generated by Google Nano Banana from the prompt: "Can you make a birthday card or an image of a birthday cake for R software? R 1.0.0 was first released on February 29, 2000 [It gets the birthday WRONG.]

#TodayinHistory #dataviz #OTD πŸ“Š
πŸŽ‚Happy #Rstats birthday!

R 1.0.0 was first released on February 29, 2000.
Does that make it 26 or just 6.5 leap-years old?
www.r-consortium.org/blog/2023/02...
[Cake by Nano Banana, but it gets age WRONG.]

02.03.2026 02:10 β€” πŸ‘ 41    πŸ” 8    πŸ’¬ 3    πŸ“Œ 0

Interesting you say that.
From a #datavis perspective, I find these sort of nice to look at, but wonder if there is a better way of showing pop. density than with skiny spikes in 3D-ish. Nearly everything but the spikes fade into the background.

02.03.2026 01:35 β€” πŸ‘ 1    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Preview
GitHub - cribbie/negligible: This package contains many functions for conducting negligible effect statistical testing (also called equivalence testing). This package contains many functions for conducting negligible effect statistical testing (also called equivalence testing). - cribbie/negligible

This #rstats #package #negligible examine negligible effect / #equivalent testing in #SEM model after #lavaan, a few of the functions include
1) #neg.semfit (CFI, RMSEA, SRMR)
2) #neg.normal

github.com/cribbie/negl...

01.03.2026 02:46 β€” πŸ‘ 9    πŸ” 6    πŸ’¬ 0    πŸ“Œ 0
3D drawing of a quincunx. It shows piles of little balls separated by vertical dividers and the shape of the distribution approximates a Gausian

3D drawing of a quincunx. It shows piles of little balls separated by vertical dividers and the shape of the distribution approximates a Gausian

Portrait of Francis Galton by Charles Wellington Furse

Portrait of Francis Galton by Charles Wellington Furse

#TodayinHistory #dataviz #Onthisday #OTD πŸ“Š
πŸ“…Feb 27, 1874 Francis Galton demonstrated the quincunx at a meeting of the Royal Institution-- showing how normal distributions arise as sum of small random effects [Stigler:1986, p.276] --
Great example of data physicalization

01.03.2026 02:51 β€” πŸ‘ 14    πŸ” 5    πŸ’¬ 1    πŸ“Œ 0

The image, of course was AI generated

01.03.2026 02:17 β€” πŸ‘ 3    πŸ” 1    πŸ’¬ 0    πŸ“Œ 0

An amusing musical side-note to this story: In 1968 a French rock-star arrived as a grad student at #Princeton in physics - JoΓ«l Sternheimer, stage name: Γ‰variste (after Galois), w/ his song,
"Connais-tu l'animal qui inventa le calcul intΓ©gral ?"
www.youtube.com/watch?v=0q7-...

Who d'ya think won?

28.02.2026 17:11 β€” πŸ‘ 5    πŸ” 2    πŸ’¬ 1    πŸ“Œ 0
Preview
Newton vs Leibniz: The Calculus War That Changed Europe Both men discovered calculus. One died celebrated. The other died alone.

If there's been a flare-up of #rstats pipe-wars, consider the war between Newton & Leibnitz over the invention of calculus

Leibnitz won in the end because his NOTATION proved to generalize better.

medium.com/@vplevris/ne...

28.02.2026 16:56 β€” πŸ‘ 17    πŸ” 1    πŸ’¬ 1    πŸ“Œ 4
Graph of the male / female birth ratio (Ratio) over 82 years from 1629 - 1710, with the points connected by lines. Also shown is the loess smooth curve, and a thick red line at the value Ratio = 1. The fact that all 82 points are above this line is equivalent in probability to getting 82 heads in 82 coin tosses.

Graph of the male / female birth ratio (Ratio) over 82 years from 1629 - 1710, with the points connected by lines. Also shown is the loess smooth curve, and a thick red line at the value Ratio = 1. The fact that all 82 points are above this line is equivalent in probability to getting 82 heads in 82 coin tosses.

Painted portrait of John Arbuthnot by the artist John Kneller

Painted portrait of John Arbuthnot by the artist John Kneller

#TodayinHistory #dataviz #Onthisday #OTD πŸ“Š
πŸ’€Feb 27, 1735 John Arbuthnot died in London, England πŸ‡¬πŸ‡§

1711: First test of statistical significance based on deviation between observed data and a null hypothesis (M/F birth ratio = 1)

#rstats: data(Arbuthnot, package = "HistData")

28.02.2026 03:32 β€” πŸ‘ 25    πŸ” 4    πŸ’¬ 0    πŸ“Œ 2
Video thumbnail

With some help from Claude Code, I have the app I've always wanted:

elicitcausal lets you design a causal graph with your theoretical priors & preregister it. Then after you complete a study, you can upload your graph and get estimates of causal learning.

Link: causal.wilddata.solutions

#rstats

27.02.2026 21:58 β€” πŸ‘ 52    πŸ” 9    πŸ’¬ 2    πŸ“Œ 2
B/W photo of John Bailey Peddle

B/W photo of John Bailey Peddle

Title page of "The Construction of Graphical Charts"

Title page of "The Construction of Graphical Charts"

An alignment chart (nomogram) for determining the load supported by  a helical spring. Four vertical scales are shown. The solution to a set of equations is determined graphically by drawing lines connecting the variables.

An alignment chart (nomogram) for determining the load supported by a helical spring. Four vertical scales are shown. The solution to a set of equations is determined graphically by drawing lines connecting the variables.

3D stenographic charts showing the relationship between temperature, surface velocity and heat generated

3D stenographic charts showing the relationship between temperature, surface velocity and heat generated

#TodayinHistory #dataviz #Onthisday #OTD πŸ“Š
πŸŽ‚Feb 27, 1868 John Bailey Peddle born in Terre Haute, Indiana, USA πŸ‡ΊπŸ‡Έ

1910: Published a textbook in English devoted exclusively to charts & statistical graphics,
"The Construction of Graphical Charts"
πŸ”—https://archive.org/details/cu31924003646449

28.02.2026 02:09 β€” πŸ‘ 5    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0
Image of an early lithographic printing press. A design is drawn onto a flat stone (or prepared metal plate, usually zinc or aluminum) and affixed by means of a chemical reaction.

Image of an early lithographic printing press. A design is drawn onto a flat stone (or prepared metal plate, usually zinc or aluminum) and affixed by means of a chemical reaction.

Etched portrait of Aloys Senefelder

Etched portrait of Aloys Senefelder

#TodayinHistory #dataviz #Onthisday #OTD πŸ“Š
πŸ’€Feb 26, 1834 Aloys Senefelder died in Munich, Germany πŸ‡©πŸ‡ͺ

1798: Invention of lithographic technique for printing of maps and diagrams (at the time, this was as significant as the invention of the Xerox machine)

28.02.2026 01:13 β€” πŸ‘ 6    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

Impressive collection, made even easier to use... βœ”οΈ

27.02.2026 02:26 β€” πŸ‘ 4    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0

An important #rstats post here. (Perhaps a better title: Why tidymodels might not be so tidy)

I don't eschew this kind of discussion (|> vs %>%, ...) as R Flame Wars. In fact, it's important to continue to hone the language tools we use to express & implement our ideas/models/graphs.

27.02.2026 02:05 β€” πŸ‘ 18    πŸ” 3    πŸ’¬ 0    πŸ“Œ 0

This blog post: "Adding Color to the World: How Maps Got Toned" well worth reading. Thx @rsimmon.bsky.social for noticing this

27.02.2026 01:44 β€” πŸ‘ 5    πŸ” 0    πŸ’¬ 0    πŸ“Œ 0