2017-02-20 3 views
2

Ich habe nach einer Lösung gesucht, aber keine der bereits vorhandenen Fragen passte zu meinem Problem.R: Gestapeltes Balkendiagramm mit Barpot, ggplot oder plotly

Ich habe einen data.frame:

Pat <- c(1,1,1,1,1,1,2,2,2,2,2,2) 
V_ID <- c(1,1,6,6,9,9,1,1,6,6,9,9) 
T_ID <- c("A","B","A","B","A","B","A","B","A","B", "A","B") 
apples <- c(1,1,1,1,1,1,1,1,1,1,1,1) 
bananas <- c(2,2,2,2,2,2,2,2,2,2,2,2) 
cranberries <- c(3,3,3,3,3,3,3,3,3,3,3,3) 

df <- data.frame(Pat,V_ID, T_ID, apples, bananas, cranberries) 

ich zu plotten versuche:

barplot(as.matrix(df[,4:6]) , 
    main="tobefound", horiz = FALSE,width = 1, 
    names.arg=colnames(df[,4:6]), 
    las=2, 
    col = c("blue", "red"), 
    legend = df[,3], 
    args.legend = list(x="topleft"), 
    beside= FALSE) 

BarPlot

enter image description here

Ich brauche zwei Änderungen: Erste von allen ich l Ike, alle "B" s (so der rote Teil in jedem Stapel) zusammen gestapelt zu haben, und dann die blauen obenauf. Zweitens: Gibt es eine Möglichkeit, die Legende nur A und B abnehmenden einmal außer diesem

legend = df[1:2,3], 

über

Adressierung ich auch nach einer Lösung gesucht bin plotly oder ggplot verwenden.

Danke,

+0

Ist [diese] (http://stackoverflow.com/questions/20349929/stacked-bar-plot-in-r?rq=1), was Sie suchen? – iled

+0

nein. Ich habe mir deinen Vorschlag vorher angesehen. Mein Ziel ist es, alle "A" und "B" s zusammen nach Farbe aufzustapeln. – Rivka

Antwort

3

Erste reshape:

df_long <- tidyr::gather(df, 'key', 'value', apples:cranberries) 

Dann Grundstück:

ggplot(df_long, aes(key, value, fill = T_ID)) + geom_col(col = 'black') 

enter image description here

Oder vielleicht ohne die Grenzen:

ggplot(df_long, aes(key, value, fill = T_ID)) + geom_col() 

enter image description here

+0

Genau das, was ich gesucht habe. Vielen Dank ! – Rivka

3

Mit Basis Grafiken, benötigt man df von T_ID zuerst zu sortieren.

df = df[order(df$T_ID), ] 

barplot(as.matrix(df[,4:6]) , 
     main="tobefound", horiz = FALSE,width = 1, 
     names.arg=colnames(df[,4:6]), 
     las=2, 
     ylim = c(0,40), 
     col = 1+as.numeric(as.factor(df$T_ID)), 
     border = NA, 
     beside= FALSE) 

box() 
legend('topleft', fill = 1+as.numeric(as.factor(levels(df$T_ID))), legend = levels(as.factor(df$T_ID))) 

enter image description here

+0

auch sehr nett, danke. – Rivka

Verwandte Themen