2015-02-05 8 views
0

Я пытаюсь создать сложную гистограмму в R, используя приведенный ниже кадр данных (df). График необходимо масштабировать, чтобы отображать пропорции, а не абсолютные значения. Идея состоит в том, чтобы иметь TiA и CvSS по оси x, а столбцы делятся на пропорции, которые каждая область занимает для TiA и CvSS соответственно.Scaled Stacked Bar Chart в R

Кто-нибудь знает, как достичь этого, используя ggplot2?

Region <- c("A", "B", "C") 
TiA <- c(2065.8408, 1020.1331, 742.8428) 
CvSS <- c(1.549020, 1.422771, 1.174165) 
df <- data.frame(Region, TiA, CvSS) 

ответ

1

Сво один вкладыш, начиная с вашего df объекта:

require(reshape2) 
ggplot(melt(df), 
    aes(x=variable, y=value, fill=Region)) + 
    geom_bar(position="fill",stat="identity") 

если вы хотите более хорошие метки:

ggplot(melt(df,variable.name="Code", value.name="Fraction") , 
    aes(x=Code, y=Fraction, fill=Region)) + 
    geom_bar(position="fill",stat="identity") 

даст их вам.

1

Да, есть несколько шагов, которые мы должны предпринять, чтобы сделать ваш заговор. Сначала я переделываю TiA и CvSS в качестве пропорции, затем растаю df. require(reshape2) require(ggplot2

Region <- c("A", "B", "C") 
TiA <- c(2065.8408, 1020.1331, 742.8428) 
CvSS <- c(1.549020, 1.422771, 1.174165) 
TiA.sum<-sum(TiA) 
CvSS.sum<-sum(CvSS) 
TiA<-TiA/TiA.sum 
CvSS<-CvSS/CvSS.sum 
df <- data.frame(Region, TiA, CvSS) 

require(reshape2) 
df.m<-melt(df) 
print(df.m) 
require(ggplot) 
qplot(data=df.m,x=variable,y=value,fill=Region,geom='bar',stat="identity") 

Выходной график выглядит следующим образом

enter image description here

редактировать комментарий Spacedman показывает более простой и более эффективный способ достижения того же графа.

+1

Вам не нужно все это масштабирование: 'ggplot (melt (df), aes (x = variable, y = value, fill = Region)) + geom_bar (position =" fill ", stat =" identity ") 'будет делать это из предоставленного' df'. – Spacedman

+0

Добавил комментарий и изменил свой ответ, чтобы выделить его. – bjoseph

Смежные вопросы