van Langren's Data on Longitude Distance between Toledo and Rome

Description

Michael Florent van Langren (1598-1675) was a Dutch mathematician and astronomer, who served as a royal mathematician to King Phillip IV of Spain, and who worked on one of the most significant problems of his time— the accurate determination of longitude, particularly for navigation at sea.

In order to convince the Spanish court of the seriousness of the problem (often resulting in great losses through ship wrecks), he prepared a 1-dimensional line graph, showing all the available estimates of the distance in longitude between Toledo and Rome, which showed large errors, for even this modest distance. This 1D line graph, from Langren (1644), is believed to be the first known graph of statistical data (Friendly etal., 2010). It provides a compelling example of the notions of statistical variability and bias.

The data frame Langren1644 gives the estimates and other information derived from the previously known 1644 graph. It turns out that van Langren produced other versions of this graph, as early as 1628. The data frame Langren.all gives the estimates derived from all known versions of this graph.

Usage

1
2
3

Format

Langren1644: A data frame with 12 observations on the following 9 variables, giving determinations of the distance in longitude between Toledo and Rome, from the 1644 graph.

Name

The name of the person giving a determination, a factor with levels A. Argelius ... T. Brahe

Longitude

Estimated value of the longitude distance between Toledo and Rome

Year

Year associated with this determination

Longname

A longer version of the Name, where appropriate; a factor with levels Andrea Argoli Christoph Clavius Tycho Brahe

City

The principal city where this person worked; a factor with levels Alexandria Amsterdam Bamberg Bologna Frankfurt Hven Leuven Middelburg Nuremberg Padua Paris Rome

Country

The country where this person worked; a factor with levels Belgium Denmark Egypt Flanders France Germany Italy Italy

Latitude

Latitude of this City; a numeric vector

Source

Likely source for this determination of Longitude; a factor with levels Astron Map

Gap

A numeric vector indicating whether the Longitude value is below or above the median

Langren.all: A data frame with 61 observations on the following 4 variables, giving determinations of Longitude between Toledo and Rome from all known versions of van Langren's graph.

Author

Author of the graph, a factor with levels Langren Lelewel

Year

Year of publication

Name

The name of the person giving a determination, a factor with levels Algunos1 Algunos2 Apianus ... Schonerus

Longitude

Estimated value of the longitude distance between Toledo and Rome

Details

In all the graphs, Toledo is implicitly at the origin and Rome is located relatively at the value of Longitude To judge correspondence with an actual map, the positions in (lat, long) are

toledo <- c(39.86, -4.03); rome <- c(41.89, 12.5)

Source

The longitude values were digitized from images of the various graphs, which may be found on the Supplementary materials page for Friendly etal. (2009).

References

Friendly, M., Valero-Mora, P. and Ulargui, J. I. (2010). The First (Known) Statistical Graph: Michael Florent van Langren and the "Secret" of Longitude. The American Statistician, 64 (2), 185-191. Supplementary materials: http://datavis.ca/gallery/langren/.

Langren, M. F. van. (1644). La Verdadera Longitud por Mar y Tierra. Antwerp: (n.p.), 1644. English translation available at http://www.math.yorku.ca/SCS/Gallery/langren/verdadera.pdf.

Lelewel, J. (1851). G?ographie du Moyen ?ge. Paris: Pilliet, 1851.

Examples

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
data(Langren1644)

####################################################
# reproductions of Langren's graph overlaid on a map
####################################################

if (require(jpeg, quietly=TRUE)) {

  gimage <- readJPEG(system.file("images", "google-toledo-rome3.jpg", package="HistData"))
  # NB: dimensions from readJPEG are y, x, colors

  gdim <- dim(gimage)[1:2]
  ylim <- c(1,gdim[1])
  xlim <- c(1,gdim[2])
  op <- par(bty="n", xaxt="n", yaxt="n", mar=c(2, 1, 1, 1) + 0.1)
  # NB: necessary to scale the plot to the pixel coordinates, and use asp=1
  plot(xlim, ylim, xlim=xlim, ylim=ylim, type="n", ann=FALSE, asp=1 )
  rasterImage(gimage, 1, 1, gdim[2], gdim[1])

  # pixel coordinates of Toledo and Rome in the image, measured from the bottom left corner
  toledo.map <- c(131, 59)
  rome.map <- c(506, 119)
  
  # confirm locations of Toledo and Rome
  points(rbind(toledo.map, rome.map), cex=2)
  text(131, 95, "Toledo", cex=1.5)
  text(506, 104, "Roma", cex=1.5)

  # set a scale for translation of lat,long to pixel x,y
  scale <- data.frame(x=c(131, 856), y=c(52,52))
  rownames(scale)=c(0,30)

  # translate from degrees longitude to pixels
  xlate <- function(x) {
    131+x*726/30	
  }

  # draw an axis
  lines(scale)
  ticks <- xlate(seq(0,30,5))
  segments(ticks, 52, ticks, 45)
  text(ticks, 40, seq(0,30,5))
  text(xlate(8), 17, "Grados de la Longitud", cex=1.7)

  # label the observations with the names
  points(x=xlate(Langren1644$Longitude), y=rep(57, nrow(Langren1644)), 
         pch=25, col="blue", bg="blue")
  text(x=xlate(Langren1644$Longitude), y=rep(57, nrow(Langren1644)), 
       labels=Langren1644$Name, srt=90, adj=c(-.1, .5), cex=0.8)
  par(op)
}

### Original implementation using ReadImages, now deprecated & shortly to be removed
## Not run: 
if (require(ReadImages)) {
  gimage <- read.jpeg(system.file("images", "google-toledo-rome3.jpg", package="HistData"))
  plot(gimage)
  
  # pixel coordinates of Toledo and Rome in the image, measured from the bottom left corner
  toledo.map <- c(130, 59)
  rome.map <- c(505, 119)
  
  # confirm locations of Toledo and Rome
  points(rbind(toledo.map, rome.map), cex=2)
  
  # set a scale for translation of lat,long to pixel x,y
  scale <- data.frame(x=c(130, 856), y=c(52,52))
  rownames(scale)=c(0,30)
  lines(scale)
  
  xlate <- function(x) {
    130+x*726/30	
  }
  points(x=xlate(Langren1644$Longitude), y=rep(57, nrow(Langren1644)), 
         pch=25, col="blue")
  text(x=xlate(Langren1644$Longitude), y=rep(57, nrow(Langren1644)), 
         labels=Langren1644$Name, srt=90, adj=c(0, 0.5), cex=0.8)
}

## End(Not run)

### First attempt using ggplot2; temporarily abandonned.
## Not run: 
require(maps)
require(ggplot2)
require(reshape)
require(plyr)
require(scales)

# set latitude to that of Toledo
Langren1644$Latitude <- 39.68

#          x/long   y/lat
bbox <- c( 38.186, -9.184,
           43.692, 28.674 )
bbox <- matrix(bbox, 2, 2, byrow=TRUE)

borders <- as.data.frame(map("world", plot = FALSE,
  xlim = expand_range(bbox[,2], 0.2),
  ylim = expand_range(bbox[,1], 0.2))[c("x", "y")])

data(world.cities)
# get actual locations of Toledo & Rome
cities <- subset(world.cities,
  name %in% c("Rome", "Toledo") & country.etc %in% c("Spain", "Italy"))
colnames(cities)[4:5]<-c("Latitude", "Longitude")

mplot <- ggplot(Langren1644, aes(Longitude, Latitude) ) +
  geom_path(aes(x, y), borders, colour = "grey60") +
  geom_point(y = 40) +
  geom_text(aes(label = Name), y = 40.1, angle = 90, hjust = 0, size = 3)
mplot <- mplot +
	geom_segment(aes(x=-4.03, y=40, xend=30, yend=40))

mplot <- mplot +
  geom_point(data = cities, colour = "red", size = 2) +
  geom_text(data=cities, aes(label=name), color="red", size=3, vjust=-0.5) +
  coord_cartesian(xlim=bbox[,2], ylim=bbox[,1])

# make the plot have approximately aspect ratio = 1
windows(width=10, height=2)
mplot

## End(Not run)


###########################################
# show variation in estimates across graphs
###########################################

library(lattice)
graph <- paste(Langren.all$Author, Langren.all$Year)
dotplot(Name ~ Longitude, data=Langren.all)

dotplot( as.factor(Year) ~ Longitude, data=Langren.all, groups=Name, type="o")

dotplot(Name ~ Longitude|graph, data=Langren.all, groups=graph)

# why the gap?
gap.mod <- glm(Gap ~ Year + Source + Latitude, family=binomial, data=Langren1644)
anova(gap.mod, test="Chisq")

Want to suggest features or report bugs for rdrr.io? Use the GitHub issue tracker.