2012-12-21 46 views
11

Tôi muốn tạo một ô hình tam giác với cấu trúc tổ chức (phân cấp) cho biết số lượng nhân viên ở mỗi cấp trong các công ty khác nhau.biểu đồ tổ chức biểu đồ tam giác

Dưới đây là một số ví dụ dữ liệu:

mylabd <- data.frame (company = rep(c("A", "B", "C"), each = 7), 
skillsDg = rep(c("Basic", "HighSc", "Undgd", "MAST", "PHD", "EXPD", "EXECT"), 3), 
number = c(200, 100, 40, 30, 10, 0, 0, 
      220, 110, 35, 10, 0, 4, 1, 
      140, 80, 120, 50, 52, 52, 3) 
      ) 
    company skillsDg number 
1  A Basic 200 
2  A HighSc 100 
3  A Undgd  40 
4  A  MAST  30 
5  A  PHD  10 
6  A  EXPD  0 
7  A EXECT  0 
8  B Basic 220 
9  B HighSc 110 
10  B Undgd  35 
11  B  MAST  10 
12  B  PHD  0 
13  B  EXPD  4 
14  B EXECT  1 
15  C Basic 140 
16  C HighSc  80 
17  C Undgd 120 
18  C  MAST  50 
19  C  PHD  52 
20  C  EXPD  52 
21  C EXECT  3 

Mục tiêu là để phản ánh như thế nào các công ty khác nhau thuê công nhân lành nghề hoặc mức độ khác nhau.

Con số giả thiết là điều này (mặc dù tô màu không hoàn hảo). enter image description here Ý tưởng là chiều rộng của đường thẳng ở mỗi giai đoạn là tỷ lệ thuận và sau đó các đường được kết nối. Nếu không có danh mục ở cấp độ tiếp theo, nó sẽ không được kết nối (như trong công ty B). Tôi không thể tìm thấy một chương trình mà có thể làm điều này và không thể tìm ra. Bất kỳ ý tưởng ?

Chỉnh sửa:

Tôi không biết nhiều về R, nhưng đây là ý tưởng của tôi. Nó chia từng đoạn đường thành hai từ một điểm để làm cho nó trở nên hợp lý. Các đường ngang được vẽ sau đó được kết nối.

enter image description here

+0

Bạn đã thử các ô violon chưa? – James

+0

Tôi không chắc chắn nó voilin cốt truyện hoạt động cho hai cách phân loại biến (thay vì tần số phân phối của biến số lượng), có thể cần phải lừa để phù hợp với nó! – rdorlearn

Trả lời

15

Tôi không biết về bất kỳ chức năng làm điều đó nhưng đây là một trong những từ đầu:

my1 <- data.frame (company = rep(c("A", "B", "C"), each = 7), skillsDg = rep(c("Basic", "HighSc", "Undgd", "MAST", "PHD", "EXPD", "EXECT"), 3), number = c(200, 100, 40, 30, 10, 0, 0, 220, 110, 35, 10, 0, 4, 1, 140, 80, 120, 50, 52, 52, 3)) 

my2 <- split(my1,my1$company) #split your dataframe into a list where each element is a company 
# The next line create the layout 
layout(matrix(1:(length(my2)+1), nrow=1), width=c(1,rep(4,length(my2)))) 
# Then we draw the x-axis: 
par(mar=c(3,0,3,0)) 
plot(NA,axes=F, xlim=c(0,1),ylim=c(1,nlevels(my1$skillsDg))) 
axis(side=4,tick=F,labels=unique(my1$skillsDg), 
    at=seq_along(unique(my1$skillsDg)), las=2, line=-4) 
# Then we apply a graphing function to each company: 
lapply(my2,function(x){ 
    par(mar=c(3,0,3,0)) 
    plot(NA, xlim=c(-max(my1$number),max(my1$number)), 
      ylim=c(1,nlevels(my1$skillsDg)),axes=F) 
    title(sub=x$company[1],line=1) 
    abline(h=seq_along(x$skillsDg), col="grey80") 
    polygon(x=c(x$number,rev(-1*x$number)), 
      y=c(seq_along(x$skillsDg),rev(seq_along(x$skillsDg))), 
      col=as.numeric(x$company)) 
    }) 

enter image description here

Sửa: Bạn có thể tất nhiên thêm bất cứ điều gì bạn muốn bên trong hàm đồ thị trong lapply (nhưng trong một số trường hợp, nó có thể có nghĩa là thay đổi một chút kích thước của biểu đồ):

layout(matrix(1:(length(my2)+1), nrow=1), width=c(1,rep(4,length(my2)))) 
par(mar=c(3,0,3,0)) 
plot(NA,axes=F, xlim=c(0,1),ylim=c(1,nlevels(my1$skillsDg))) 
axis(side=4,tick=F,labels=unique(my1$skillsDg), 
    at=seq_along(unique(my1$skillsDg)), las=2, line=-4) 
lapply(my2,function(x){ 
    par(mar=c(3,0,3,0)) 
    plot(NA, xlim=c(-max(my1$number)-50,max(my1$number)+50), 
     ylim=c(1,nlevels(my1$skillsDg)),axes=F) 
    title(sub=x$company[1],line=1) 
    abline(h=seq_along(x$skillsDg), col="grey80") 
    text(x=x$number+5, y=seq_along(x$skillsDg)+.1, label=x$number, pos=4) 
    polygon(x=c(x$number,rev(-1*x$number)), 
     y=c(seq_along(x$skillsDg),rev(seq_along(x$skillsDg))), 
     col=as.numeric(x$company)) 
    }) 

enter image description here

+0

tuyệt vời! cảm ơn !! Tôi nghĩ rằng nhãn được viết tắt bằng chữ cái - ví dụ Exect sau Basic, tôi nghĩ điểm dữ liệu là chính xác, chỉ cần nhãn – rdorlearn

+2

Cái xấu của tôi. Tôi sửa nó rồi. Tôi muốn sử dụng thực tế rằng danh mục này là yếu tố nhưng quên rằng mặc định cho các yếu tố được sắp xếp theo thứ tự bảng chữ cái. – plannapus

+1

Chỉ cần yêu cầu nhỏ (hy vọng tôi không yêu cầu quá nhiều), chúng ta có thể thêm số ở mỗi giai đoạn, có thể ở bên phải hoặc bên trái của dòng cho mỗi cấp độ giáo dục – rdorlearn

1

biểu đồ khác nhau hơn bạn yêu cầu, nhưng một nỗ lực để làm theo một số nguyên tắc trực quan điểm chung:

library(ggplot2) 
mylabd$skillsDg <- factor(mylabd$skillsDg, levels = c("Basic", "HighSc", "Undgd", "MAST", "PHD", "EXPD", "EXECT")) 
p <- ggplot(data=mylabd, aes(x=skillsDg, y=number, fill = skillsDg)) 
p <- p + geom_bar(stat = "identity") + coord_flip() 
p <- p + facet_wrap(~ company, ncol = 1, nrow=3) 
plot(p) 

enter image description here

5

Sử dụng lưới gói, chúng ta có thể có đôi điều như thế này:

enter image description here

mylabd <- data.frame (company = rep(c("A", "B", "C"), each = 7), 
         skillsDg = rep(c("Basic", "HighSc", "Undgd", "MAST", "PHD", "EXPD", "EXECT"), 3), 
         number = c(200, 100, 40, 30, 10, 0, 0, 
           220, 110, 35, 10, 0, 4, 1, 
           140, 80, 120, 50, 52, 52, 3) 
) 



## to comapre we need o have the same scales for all organizations 
nskills <- nlevels(mylabd$skillsDg) 
ncompany <- nlevels(mylabd$company) 
barYscale <- c(0, nskills) * 1.05 
barXscale <- c(0, max(mylabd$number))* 1.05 
## the global scene 
vp <- plotViewport(c(5, 4, 4, 1), 
        yscale = barYscale, 
        layout = grid.layout(nrow=1,ncol=nbars)) 

pushViewport(vp) 
grid.rect() 
grid.yaxis(at=c(1:nlevels(mylabd$skillsDg)),label=unique(mylabd$skillsDg)) 
grid.grill() 

## split data by companya 
data.splitted <- split(mylabd,f=mylabd$company) 
lapply(1:3,function(company){ 

    x <- data.splitted[[company]] 
    vv <- x$number 
    companyName <- unique(x$company) 

    pushViewport(viewport(layout.pos.col=company,  
         xscale = barXscale, 
         yscale = barYscale)) 
    grid.rect() 
# grid.xaxis(at= mean(x$number),label = companyName) 
    grid.xaxis() 
    grid.polygon(x = unit.c(unit(0.5,'npc')-unit(vv/2,'native'), 
          unit(0.5,'npc')+unit(rev(vv)/2,'native')), 
       y = unit.c(unit(1:nmeasures,'native'), 
          unit(rev(1:nmeasures),'native')), 
       gp=gpar(fill = rainbow(nmeasures)[company])) 
    grid.polygon(x = unit.c(unit(0.5,'npc')-unit(vv/2,'native'), 
          unit(0.5,'npc')+unit(rev(vv)/2,'native')), 
       y = unit.c(unit(1:nmeasures,'native'), 
          unit(rev(1:nmeasures),'native')), 
       id = c(1:nmeasures,rev(1:nmeasures)), 
       gp=gpar(fill = NA)) 

    grid.text(x = unit(0.5,'npc'), 
      y = unit(0.5,'native'), 
      label = unique(x$company)) 

    popViewport() 

}) 

popViewport() 
+0

+1 rất đẹp !! – rdorlearn

Các vấn đề liên quan