With a slightly different approach, you can keep the labels in the area under the charts. This version creates unique x breaks by concatenating V1 and V2 in a way similar to jlhoward's method but then restores V2 as the x labels using the function roles in the code below in the scale_x_discrete statement.
library(ggplot2)
df <- read.table("speaking_distribution_by_play.txt",
header = F,
sep = "")
# Creates a small test subset; remove for complete set
df <- df[df$V1 %in% c("Mac.xml","MM.xml","MND.xml","MV.xml"),]
# used to create x-axis label restoring original name of role
roles <- function(x) sub("[^_]*_","",x )
ggplot(cbind(df, V4=paste(df$V1,df$V2,sep="_")), aes(x=reorder(V4,V3), y=V3) ) +
geom_bar(stat = "identity") +
facet_wrap(~ V1, ncol=4, scales = "free_x") +
labs(title = "Distribution of Speakers in Shakespearean Drama") +
xlab("Speaking Role") +
ylab("Words Spoken") +
scale_x_discrete(labels=roles) +
theme(axis.text.x=element_text(angle=90, hjust=1))
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…