>>>>> Jeffrey Dick     on Wed, 5 Nov 2025 15:54:36 +0800 writes:

    > Setosa sepals are bigger than petals in both length and width:
    > summary(subset(iris, Species == "setosa"))

    >   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   Species
    >  Min.   :4.300   Min.   :2.300   Min.   :1.000   Min.   :0.100  setosa    
:50
    >  1st Qu.:4.800   1st Qu.:3.200   1st Qu.:1.400   1st Qu.:0.200  
versicolor: 0
    >  Median :5.000   Median :3.400   Median :1.500   Median :0.200  virginica 
: 0
    >  Mean   :5.006   Mean   :3.428   Mean   :1.462   Mean   :0.246
    >  3rd Qu.:5.200   3rd Qu.:3.675   3rd Qu.:1.575   3rd Qu.:0.300
    >  Max.   :5.800   Max.   :4.400   Max.   :1.900   Max.   :0.600

    > However, in the first example with iris in ?matplot, setosa petals (small 
red "s") appear to be longer and wider than sepals (big blue "S"). The symbols 
for versicolor are also swapped. (I'm using R 4.5.2.)

    > A possible fix is to change legend() to put "Sepals" before "Petals" for 
both species. This ordering corresponds with the column indexing used in the 
example:

    > iS <- iris$Species == "setosa"
    > names(iris[iS,c(1,3)]) == c("Sepal.Length", "Petal.Length")
    > names(iris[iS,c(2,4)]) == c("Sepal.Width", "Petal.Width")

    > The original legend used bigger (uppercase) symbols for bigger flower 
parts. Whether or not this was intentional, it is an intuitive choice. Such a 
congruence can be maintained by changing "sS" to "Ss" and "vV" to "Vv" in all 
three pch assignments.

    > Here is a modified example with the proposed changes in legend and pch.

    > table(iris$Species) # is data.frame with 'Species' factor
    > iS <- iris$Species == "setosa"
    > iV <- iris$Species == "versicolor"
    > op <- par(bg = "bisque")
    > matplot(c(1, 8), c(0, 4.5), type =  "n", xlab = "Length", ylab = "Width",
    >         main = "Petal and Sepal Dimensions in Iris Blossoms")
    > matpoints(iris[iS,c(1,3)], iris[iS,c(2,4)], pch = "Ss", col = c(2,4))
    > matpoints(iris[iV,c(1,3)], iris[iV,c(2,4)], pch = "Vv", col = c(2,4))
    > legend(1, 4, c("    Setosa Sepals", "    Setosa Petals",
    >                "Versicolor Sepals", "Versicolor Petals"),
    >        pch = "SsVv", col = rep(c(2,4), 2))

    > Regards,
    > Jeff Dick

Thanks a lot, Jeff.

This is an absolute record find in "R history":
This example has been *unchanged* in the matplot.Rd file already

in R's svn rev 2 -- file date  18. Sep 1997
 -- almost 2.5 years before R version 1.0.0

i.e., more than 28 years ago.... and you did properly find an
error, indeed, even though only in the plot labeling.

I will fix it slightly differently than you, keeping the legend
identical, and using slightly more "principled" code....

basically this:

PS <- c("Petal", "Sepal") ; clr <- c(2,4)
psL <- paste(PS, "Length",sep="."); Sps <- paste0("    Setosa ", PS, "s")
psW <- paste(PS, "Width", sep="."); Vps <- paste0("Versicolor ", PS, "s")
matplot(c(1, 8), c(0, 4.5), type = "n", xlab = "Length", ylab = "Width",
        main = "Petal and Sepal Dimensions in Iris Blossoms -- new version" )
matpoints(iris[iS, psL], iris[iS, psW], pch = "sS", col = clr)
matpoints(iris[iV, psL], iris[iV, psW], pch = "vV", col = clr)
legend(1, 4, c(Sps, Vps), pch = "sSvV", col = rep(clr, 2))

---
Thanks again, Jeff!

Martin

--
Martin Maechler
ETH Zurich  and   R Core team

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to