2012-09-18 20 views
5

Eventuali duplicati:
add text to horizontal barplot in R, y-axis at different scale?
Annotate values above bars (ggplot faceted)Come visualizzare la frequenza nella parte superiore di ogni fattore in un barplot in R

usando il codice seguente, spero di mostra un numero sopra ogni colonna che corrisponde al valore y per quella colonna. In altre parole, sto cercando di ottenere "QnWeight_initial" per visualizzare 593 nella parte superiore della barra grigia e così e ...

I miei dati:

data<-structure(list(V1 = structure(c(2L, 1L), .Label = c("593", "QnWeight_initial" 
), class = "factor"), V2 = structure(c(2L, 1L), .Label = c("566", 
"Head"), class = "factor"), V3 = structure(c(2L, 1L), .Label = c("535", 
"V1"), class = "factor"), V4 = structure(c(2L, 1L), .Label = c("535", 
"V2"), class = "factor"), V5 = structure(c(2L, 1L), .Label = c("535", 
"V3"), class = "factor"), V6 = structure(c(2L, 1L), .Label = c("482", 
"Left_Leg"), class = "factor"), V7 = structure(c(2L, 1L), .Label = c("474", 
"Left_Antenna"), class = "factor"), V8 = structure(c(2L, 1L), .Label = c("237", 
"Qn_Weight_Loss"), class = "factor"), V9 = structure(c(2L, 1L 
), .Label = c("230", "Days_wrkr_eclosion"), class = "factor"), 
    V10 = structure(c(2L, 1L), .Label = c("81", "Growth_all"), class = "factor"), 
    V11 = structure(c(2L, 1L), .Label = c("79", "Growth_1_2"), class = "factor"), 
    V12 = structure(c(2L, 1L), .Label = c("62", "Growth_1_3"), class = "factor"), 
    V13 = structure(c(2L, 1L), .Label = c("60", "Growth_2_3"), class = "factor"), 
    V14 = structure(c(2L, 1L), .Label = c("51", "Right_Antenna" 
    ), class = "factor"), V15 = structure(c(2L, 1L), .Label = c("49", 
    "Left_Leg_Remeasure"), class = "factor"), V16 = structure(c(2L, 
    1L), .Label = c("49", "Right_Leg"), class = "factor"), V17 = structure(c(2L, 
    1L), .Label = c("47", "Head_Remeasure"), class = "factor"), 
    V18 = structure(c(2L, 1L), .Label = c("46", "Left_Antenna_Remeasure" 
    ), class = "factor")), .Names = c("V1", "V2", "V3", "V4", 
"V5", "V6", "V7", "V8", "V9", "V10", "V11", "V12", "V13", "V14", 
"V15", "V16", "V17", "V18"), class = "data.frame", row.names = c(NA, 
-2L)) 
dat<-data.frame(fac=unlist(data[1,, drop=FALSE]), freqs=unlist(data[2,, drop=FALSE])) 

La trama:

barplot(as.numeric(as.character(dat$freqs)) , main="Sample Sizes of Various Fitness Traits", xaxt='n', xlab='', width=0.85, ylab="Frequency") 
par(mar=c(5,8,4,2)) 
labels<-unlist(data[1,,drop=FALSE]) 
text(1:18, par("usr")[3] -0.25, srt=90, adj=1,labels=labels,xpd=TRUE, cex=0.6) 
+0

Sicuramente questa domanda è stato chiesto prima su SO. Questo è vicino: http://stackoverflow.com/questions/4217207/add-text-to-horizontal-barplot-in-ry-axis-at-different-scale –

+0

Quindi, ho guardato entrambi, e io ' sto ancora avendo qualche difficoltà. Ho provato senza successo alcune varietà come: text (x = as.character (dat $ fac), y = as.numeric (as.character (dat $ freqs)), labels = as.numeric (as.character (dat $ freqs)), pos = 3) – Atticus29

+0

Non viene mostrato nulla. Una istanziazione di text() interferisce con un'altra? – Atticus29

risposta

25

Si verificano problemi perché dat$freqs è un fattore, anche se la rappresentazione stampata 'sembra' è numerica. (E 'quasi sempre utile digitare str(foo) - qui str(dat) o str(dat$freqs) - per avere uno sguardo alla struttura reale dei dati che si sta lavorando.)

In ogni caso, una volta che hai convertito dat$freq in classe "numeric", costruendo la trama diventa semplice:

## Make the frequencies numbers (rather than factors) 
dat$freqs <- as.numeric(as.character(dat$freqs)) 
## Find a range of y's that'll leave sufficient space above the tallest bar 
ylim <- c(0, 1.1*max(dat$freqs)) 
## Plot, and store x-coordinates of bars in xx 
xx <- barplot(dat$freqs, xaxt = 'n', xlab = '', width = 0.85, ylim = ylim, 
       main = "Sample Sizes of Various Fitness Traits", 
       ylab = "Frequency") 
## Add text at top of bars 
text(x = xx, y = dat$freqs, label = dat$freqs, pos = 3, cex = 0.8, col = "red") 
## Add x-axis labels 
axis(1, at=xx, labels=dat$fac, tick=FALSE, las=2, line=-0.5, cex.axis=0.5) 

enter image description here

+0

Grazie mille! Ho appena imparato un po '. Molto apprezzato. – Atticus29

+0

@ Atticus29 - Grande. Felice di sapere che ha aiutato. –

+0

Ciao C'è un modo per aggiungere quei numeri nella parte superiore della barra ma in parallelo all'asse y ?? Ho provato l'opzione las su testo ma non ha funzionato – user3138373

Problemi correlati