2015-05-14 2 views
0

Следующий код, измененный из более раннего сообщения, создает окно графика, содержащее круговую диаграмму. Я хотел бы иметь возможность размещать в окне несколько круговых диаграмм, но у меня проблемы с размещением. Последовательные вызовы функции круговой диаграммы не заполняют график в ожидаемом порядке (две круговые диаграммы помещаются в противоположные углы сюжета, а затем дальнейшие вызовы не добавляют больше круговых диаграмм, хотя есть пространство). Есть ли способ исправить это? В конечном итоге мне нужны 6 круговых диаграмм (3 строки и 2 столбца).Несколько графических фрагментов в R

rm(list = ls(all = TRUE)) 

# DATA 
mydf <- structure(list(inner_category = structure(c(3L, 3L, 3L, 3L, 2L, 2L, 
    2L, 1L, 5L, 5L, 4L), .Label = c("group1", "group2", "group3", 
    "group4", "group5"), class = "factor"), outer_category = structure(c(5L, 
    6L, 7L, 8L, 2L, 3L, 4L, 1L, 10L, 11L, 9L), .Label = c("group1_A", 
    "group1_B", "group1_C", "group1_D", "group2_A", "group2_B", 
    "group2_C", "group2_D", "group3_A", "group4_A", "group4_B"), 
    class = "factor"), share = c(10.85, 7.35, 33.06, 2.81, 1.58, 
    13.12, 5.43, 9.91, 1.42, 4.55, 1.65)), .Names = c("inner_category", "outer_category", "share"), 
    row.names = c(NA, -11L), class = "data.frame") 

mydf$total <- with(mydf1, ave(share, inner_category, FUN = sum)) 

# PLOTTING WINDOW 
quartz("Quartz", width=9, height=8, pointsize=18) 
par(mfrow=c(3,2), mar=c(4,4,2,0.5), mgp = c(1.5, 0.3, 0), tck = -0.01) 

#FUNCTION 
donutplotfunction <- function(myfile, width = 15, height = 11) { 

    ## HOUSEKEEPING 
    if (missing(myfile)) file <- getwd() 
    op <- par(no.readonly = TRUE); on.exit(par(op)) 

    nr <- nrow(myfile) 
    width <- max(sqrt(myfile$share))/0.8 

    tbl <- with(myfile, table(inner_category)[order(unique(inner_category))]) 
    cols <- c('cyan2','red','orange','green','dodgerblue2') 
    cols <- unlist(Map(rep, cols, tbl)) 

    ## LOOP TO CREATE PIE SLICES 
    par(omi = c(0.5,0.5,0.75,0.5), mai = c(0.1,0.1,0.1,0.1), las = 1) 
    for (i in 1:nr) { 
    par(new = TRUE) 

    ## CREATE COLORS AND SHADES 
    rgb <- col2rgb(cols[i]) 
    f0 <- rep(NA, nr) 
    f0[i] <- rgb(rgb[1], rgb[2], rgb[3], 190/sequence(tbl)[i], maxColorValue = 255) 

    ## CREATE LABELS FOR THE OUTERMOST SECTION 
    lab <- with(myfile, sprintf('%s: %s', outer_category, share)) 
    if (with(myfile, share[i] == max(share))) { 
     lab0 <- lab 
    } else lab0 <- NA 

    ## PLOT THE OUTSIDE PIE AND SHADES OF SUBGROUPS 
    par(lwd = 0.1) 
    pie(myfile$share, border = "white", radius = 5/width, col = f0, labels = lab0, cex = 0.7, ticks = 0) 

    ## REPEAT ABOVE FOR THE MAIN GROUPS 
    par(new = TRUE) 
    rgb <- col2rgb(cols[i]) 
    f0[i] <- rgb(rgb[1], rgb[2], rgb[3], maxColorValue = 255) 
    par(lwd = 0.1) 
    pie(myfile$share, border = "white", radius = 4/width, col = f0, labels = NA) 
    } 

    ## GRAPH TITLE 
    text(x = c(-.05, -.05, 0.15, .25, .3), y = c(.08, -.12, -.15, -.08, -.02), labels = unique(myfile$inner_category), col = 'black', cex = 0.8) 
    mtext('Figure Main Title', side = 3, line = -1, adj = 0, cex = 1, outer = TRUE) 
} 

donutplotfunction(mydf) 

ответ

2

Во-первых, несколько советов. (1) людям легче помочь, если вы разместите minimal example. В вашем коде есть много деталей, которые не имеют отношения к проблеме - попробуйте устранить такой код. (2) Так как rgb является именем функции, постарайтесь избежать использования rgb для имени переменной. (3) Вам не нужно зацикливать кусочки пирога - просто попросите R нарисовать все кусочки сразу. (4) У вас было слишком много заявлений par(new=TRUE).

Я думаю, что следующий код является сущностью того, что вы хотите.

mydf <- structure(list(inner_category = structure(c(3L, 3L, 3L, 3L, 2L, 2L, 
2L, 1L, 5L, 5L, 4L), .Label = c("group1", "group2", "group3", 
"group4", "group5"), class = "factor"), outer_category = structure(c(5L, 
6L, 7L, 8L, 2L, 3L, 4L, 1L, 10L, 11L, 9L), .Label = c("group1_A", 
"group1_B", "group1_C", "group1_D", "group2_A", "group2_B", 
"group2_C", "group2_D", "group3_A", "group4_A", "group4_B"), 
class = "factor"), share = c(10.85, 7.35, 33.06, 2.81, 1.58, 
13.12, 5.43, 9.91, 1.42, 4.55, 1.65)), .Names = c("inner_category", "outer_category", "share"), 
row.names = c(NA, -11L), class = "data.frame") 

donutplotfunction <- function(myfile, width = 7) { 

    tbl <- with(myfile, table(inner_category)[order(unique(inner_category))]) 
    cols <- c('cyan2','red','orange','green','dodgerblue2') 
    cols <- unlist(Map(rep, cols, tbl)) 
    rg <- col2rgb(cols) 
    col.lt <- rgb(rg[1,], rg[2,], rg[3,], alpha = 190/sequence(tbl), maxColorValue = 255) 
    col.dk <- rgb(rg[1,], rg[2,], rg[3,], maxColorValue = 255) 

    # Outside pie 
    pie(myfile$share, border = "white", radius = 5/width, col = col.lt, cex = 0.7) 
    # Inside pie. Use 'new' to get overplotting 
    par(new = TRUE) 
    pie(myfile$share, border = "white", radius = 4/width, col = col.dk, labels = NA) 

} 

#windows() 
par(mfrow=c(3,2), mar=c(4,4,2,0.5), mgp = c(1.5, 0.3, 0), tck = -0.01) 

donutplotfunction(mydf) 
donutplotfunction(mydf) 
donutplotfunction(mydf) # etc 
+0

Спасибо за советы по кодированию, очень признателен. Это решение работает хорошо. Одна вещь, которую я замечаю, заключается в том, что, пытаясь увеличить размер каждой круговой диаграммы в сюжете, я достигаю предела, за которым торцы сплющены и не могут стать больше. Что задает этот предел, и могу ли я это исправить? Кроме того, я заинтересован в улучшении моего кодирования. Что вызвало проблему размещения места в коде исходного сообщения? Большое спасибо! – marcel

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