Wil
Wil

Reputation: 13

Undefined numbers of rows when writing a title for ggplot2 in r

I am using ggplot to plot a dataset. The dataset is like this:

    pr0   pr1
A1  0.1   0.9
A2  0.2   0.8
A3  0.7   0.3

Below is my code:

aggregate <- function(){agg.1 <- data rownames(agg.1) <- colnames(Q) agg <- melt(agg.1) per.agg <- paste(round(100*(agg.1[,2]), 2), "%", sep="") text <- paste(per.agg[1],"have A1","\n", per.agg[2],"have A2","\n", per.agg[3],"have A3","\n") ggplot(data=agg,aes(x=agg[,1], y=agg[,3],fill=factor(agg[,2])))+ geom_bar(stat="identity",position = "stack")+ xlab("")+ylab("Aggregated Examinee Attribute Mastery Rate")+ ggtitle(text) }

The problem is that the possible numbers in per.agg[_] may range from 1 to 100, and in "of examinees have mastered A1", "A1" could be from 1 to 100. Now I have listed three, but when I have four, for example,

    pr0   pr1
A1  0.1   0.9
A2  0.2   0.8
A3  0.7   0.3
A4  0.3   0.7

I will need to add per.agg[4], and A4. The number will be the same as ncol(Q). How can I incorporate every possible number?

Upvotes: 0

Views: 41

Answers (1)

bouncyball
bouncyball

Reputation: 10761

Here's an example which I think you could pretty quickly adapt to your situation:

generate some data

set.seed(123)
df1 <- data.frame(x = letters[1:5],
                  y = rpois(5,5))

df1

#   x y
# 1 a 4
# 2 b 7
# 3 c 4
# 4 d 8
# 5 e 9

use sapply, paste, and specify collapse = ' \n '

paste(sapply(1:nrow(df1), 
      function(x) paste(df1[x,2], 'have', paste0('A',x))), 
      collapse = ' \n ')

# "4 have A1 \n 7 have A2 \n 4 have A3 \n 8 have A4 \n 9 have A5"

For your example, I think you'd replace 1:nrow(df1) with 1:ncol(Q) and df1[x,2] with per.agg[x]:

paste(sapply(1:ncol(Q), 
      function(x) paste(per.agg[x], 'have', paste0('A',x))), 
      collapse = ' \n ')

Upvotes: 1

Related Questions