Skip to content

ggplot2 Version of Figures in “Lattice: Multivariate Data Visualization with R” (Part 4)

July 2, 2009

This is the fourth post in a series attempting to recreate the figures in Lattice: Multivariate Data Visualization with R (R code) with ggplot2.


Chapter 4 – Displaying Multiway Tables

Topics covered:

  • Cleveland dot plot
  • Bar chart
  • Reordering factor levels

Figure 4.1

> library(lattice)
> library(ggplot2)
> data(VADeaths)

lattice

> pl <- dotplot(VADeaths, groups = FALSE)
> print(pl)

ggplot2

> pg <- ggplot(melt(VADeaths), aes(value, X1)) + geom_point() +
+     facet_wrap(~X2) + ylab("")
> print(pg)

chapter04-04_01_l_small.png chapter04-04_01_r_small.png

Figure 4.2

lattice

> pl <- dotplot(VADeaths, groups = FALSE, layout = c(1,
+     4), aspect = 0.7, origin = 0, type = c("p", "h"),
+     main = "Death Rates in Virginia - 1940", xlab = "Rate (per 1000)")
> print(pl)

ggplot2

> p <- ggplot(melt(VADeaths), aes(x = 0, xend = value,
+     y = X1, yend = X1))
> pg <- p + geom_point(aes(value, X1)) + geom_segment() +
+     facet_wrap(~X2, ncol = 1) + labs(x = "Rate (per 1000)",
+     y = "") + opts(title = "Death Rates in Virginia - 1940")
> print(pg)
Note When using facet_wrap() it is not possible to manipulate the aspect ratio of facets. A workaround is to tweak the output image dimensions when saving the output graph to a file.

chapter04-04_02_l_small.png chapter04-04_02_r_small.png

Figure 4.3

lattice

> pl <- dotplot(VADeaths, type = "o", auto.key = list(lines = TRUE,
+     space = "right"), main = "Death Rates in Virginia - 1940",
+     xlab = "Rate (per 1000)")
> print(pl)

ggplot2

> p <- ggplot(melt(VADeaths), aes(value, X1, colour = X2,
+     group = X2))
> pg <- p + geom_point() + geom_line() + xlab("Rate (per 1000)") +
+     ylab("") + opts(title = "Death Rates in Virginia - 1940")
> print(pg)

chapter04-04_03_l_small.png chapter04-04_03_r_small.png

Figure 4.4

lattice

> pl <- barchart(VADeaths, groups = FALSE, layout = c(1,
+     4), aspect = 0.7, reference = FALSE, main = "Death Rates in Virginia - 1940",
+     xlab = "Rate (per 100)")
> print(pl)

ggplot2

> p <- ggplot(melt(VADeaths), aes(X1, value))
> pg <- p + geom_bar(stat = "identity") + facet_wrap(~X2,
+     ncol = 1) + coord_flip() + xlab("") + ylab("Rate (per 1000)") +
+     opts(title = "Death Rates in Virginia - 1940")
> print(pg)
Note When using facet_wrap() it is not possible to manipulate the aspect ratio of facets. A workaround is to tweak the output image dimensions when saving the output graph to a file.

chapter04-04_04_l_small.png chapter04-04_04_r_small.png

Figure 4.5

> data(postdoc, package = "latticeExtra")

lattice

> pl <- barchart(prop.table(postdoc, margin = 1), xlab = "Proportion",
+     auto.key = list(adj = 1))
> print(pl)

ggplot2

> pg <- ggplot(as.data.frame(postdoc), aes(Field, Freq,
+     fill = Reason)) + geom_bar(position = "fill") + coord_flip() +
+     scale_x_discrete(formatter = "abbreviate")
> print(pg)

chapter04-04_05_l_small.png chapter04-04_05_r_small.png

Figure 4.6

lattice

> pl <- dotplot(prop.table(postdoc, margin = 1), groups = FALSE,
+     xlab = "Proportion", par.strip.text = list(abbreviate = TRUE,
+         minlength = 10))
> print(pl)

ggplot2

> postdoc.df <- as.data.frame(prop.table(postdoc, margin = 1),
+     stringsAsFactors = FALSE)
> postdoc.df$Reason <- abbreviate(postdoc.df$Reason, minlength = 10)
> pg <- ggplot(postdoc.df, aes(Freq, Field)) + geom_point() +
+     facet_wrap(~Reason) + xlab("Proportion") + ylab("")
> print(pg)

chapter04-04_06_l_small.png chapter04-04_06_r_small.png

Figure 4.7

lattice

> pl <- dotplot(prop.table(postdoc, margin = 1), groups = FALSE,
+     index.cond = function(x, y) median(x), xlab = "Proportion",
+     layout = c(1, 5), aspect = 0.6, scales = list(y = list(relation = "free",
+         rot = 0)), prepanel = function(x, y) {
+         list(ylim = levels(reorder(y, x)))
+     }, panel = function(x, y, ...) {
+         panel.dotplot(x, reorder(y, x), ...)
+     })
> print(pl)

ggplot2

Sorting each facets separately is not possible in ggplot2.

chapter04-04_07_l_small.png

Figure 4.8

> data(Chem97, package = "mlmRev")

lattice

> gcsescore.tab <- xtabs(~gcsescore + gender, Chem97)
> gcsescore.df <- as.data.frame(gcsescore.tab)
> gcsescore.df$gcsescore <- as.numeric(as.character(gcsescore.df$gcsescore))
> pl <- xyplot(Freq ~ gcsescore | gender, data = gcsescore.df,
+     type = "h", layout = c(1, 2), xlab = "Average GCSE Score")
> print(pl)

ggplot2

> pg <- ggplot(Chem97, aes(gcsescore)) + geom_linerange(aes(ymin = 0,
+     ymax = ..count..), stat = "bin", binwidth = 0.005) +
+     facet_wrap(~gender, ncol = 1) + xlab("Average GCSE Score") +
+     ylab("")
> print(pg)

chapter04-04_08_l_small.png chapter04-04_08_r_small.png

Figure 4.9

lattice

> score.tab <- xtabs(~score + gender, Chem97)
> score.df <- as.data.frame(score.tab)
> pl <- barchart(Freq ~ score | gender, score.df, origin = 0)
> print(pl)

ggplot2

> pg <- ggplot(Chem97, aes(factor(score))) + geom_bar(aes(y = ..count..),
+     stat = "bin") + facet_grid(. ~ gender) + xlab("")
> print(pg)

chapter04-04_09_l_small.png chapter04-04_09_r_small.png

6 Comments leave one →
  1. November 16, 2010 9:05 am

    For Figure 4.5, is there any way to center a label on each of the bars with the percentage?

    • learnr permalink*
      November 16, 2010 11:28 am

      I suggest you calculate the percentages from the raw data, and then place them on the bars using geom_text().

Trackbacks

  1. ggplot2 Version of Figures in “Lattice: Multivariate Data Visualization with R” (Part 5) « Learning R
  2. ggplot2 Version of Figures in “Lattice: Multivariate Data Visualization with R” (Part 6) « Learning R
  3. ggplot2 Version of Figures in “Lattice: Multivariate Data Visualization with R” (Part 10) « Learning R
  4. datanalytics » Diagramas de puntos (dotplots)

Leave a comment