2013-02-12 3 views
16

У меня есть этот кадр данных:Места легенда для каждой facet_wrap сетки в ggplot2

 Date Server FileSystem PercentUsed 
1 12/1/2011  A  /  60 
2 1/2/2012  A  /var   50 
3 2/1/2012  A  tmp   90 
4 2/10/2012  A  /db   86 
5 2/13/2012  A  /app   90 
6 12/1/2011  B   C:   67 
7 1/2/2012  B   D:   67 
8 2/1/2012  B   F:   34 
9 2/10/2012  B /restore   89 
10 2/13/2012  B   G:   56 
11 12/1/2011  C  /  90 
12 1/2/2012  C  /tmp   78 
13 2/1/2012  C  /data   67 
14 2/10/2012  C /Storage   34 
15 2/13/2012  C /database   12 

dput(x) 
structure(list(Date = structure(c(2L, 1L, 3L, 4L, 5L, 2L, 1L, 
3L, 4L, 5L, 2L, 1L, 3L, 4L, 5L), .Label = c("1/2/2012", "12/1/2011", 
"2/1/2012", "2/10/2012", "2/13/2012"), class = "factor"), Server = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), FileSystem = structure(c(1L, 9L, 
14L, 5L, 2L, 10L, 11L, 12L, 6L, 13L, 1L, 8L, 3L, 7L, 4L), .Label = c("/", 
"/app", "/data", "/database", "/db", "/restore", "/Storage", 
"/tmp", "/var", "C:", "D:", "F:", "G:", "tmp"), class = "factor"), 
    PercentUsed = c(60L, 50L, 90L, 86L, 90L, 67L, 67L, 34L, 89L, 
    56L, 90L, 78L, 67L, 34L, 12L)), .Names = c("Date", "Server", 
"FileSystem", "PercentUsed"), class = "data.frame", row.names = c(NA, 
-15L)) 

Я хотел бы поставить легенду прямо рядом с каждой facet_wrap сетки, своя FileSystem:

Когда я это, это ставит легенду на стороне участка для всего FileSystem. Можно ли поставить FileSystem на каждый сервер рядом с каждой сеткой?

ggplot(x, aes(Date, PercentUsed, group=1, colour=FileSystem)) + 
    geom_jitter(size=0.5) + geom_smooth(method="loess", se=T) + 
    facet_wrap(~Server, ncol=1) 

ответ

19

Мех, @joran бить меня к нему (мой gridExtra устарел, но взял мне 10 минут, чтобы это понять). Вот аналогичное решение, но этот скин кошка в общем случае имеет уровни в Server.

library(gridExtra) 
out <- by(data = x, INDICES = x$Server, FUN = function(m) { 
     m <- droplevels(m) 
     m <- ggplot(m, aes(Date, PercentUsed, group=1, colour = FileSystem)) + 
     geom_jitter(size=2) + geom_smooth(method="loess", se=T) 
    }) 
do.call(grid.arrange, out) 

# If you want to supply the parameters to grid.arrange 
do.call(grid.arrange, c(out, ncol=3)) 

image

+0

Очень приятно. Я не понимал, что 'droplevels()' имеет метод для 'data.frame'. Это удобно! –

+0

Есть ли опрятный способ принудительного выравнивания, т. Е. Сохранить ширину участка так же? Укажите ширину легенды? – mlt

+0

@mlt рассмотреть возможность переноса легенды на верхнюю часть первой фигуры и удалить ее из остальной части. –

19

Лучший способ сделать это с gridExtra пакет:

library(gridExtra) 

xs <- split(x,f = x$Server) 
p1 <- ggplot(xs$A,aes(x = Date,y = PercentUsed,group = 1,colour = FileSystem)) + 
     geom_jitter(size=0.5) + 
     geom_smooth(method="loess", se=T) + 
     facet_wrap(~Server, ncol=1) 

p2 <- p1 %+% xs$B 
p3 <- p1 %+% xs$C 

grid.arrange(p1,p2,p3) 

enter image description here

+0

Я хотел бы отметить, что вы сделали пункты очень маленькие в 'geom_jitter', и я не знаю, почему, но я оставил как есть. Точки там, но трудно увидеть. – joran

+1

Я немного заинтригован оператором '% + %'. Не могли бы вы объяснить, что он делает? – Legend

+2

@Legend Это способ сделать объект ggplot «модульным» в том смысле, что вы можете использовать его, чтобы просто опустить новый кадр данных, но использовать все те же спецификации геометрии из предыдущего графика. Конечно, он будет работать только в том случае, если имена столбцов совпадают, и если вы еще не использовали кадры _other_ данных в других слоях. – joran

2

Вместо того, чтобы использовать грани, мы могли бы составить список участков на группу, а затем использовать cowplot :: plot_grid для черчения. Каждый из них будет иметь свою собственную легенду:

# make list of plots 
ggList <- lapply(split(x, x$Server), function(i) { 
    ggplot(i, aes(Date, PercentUsed, group = 1, colour = FileSystem)) + 
    geom_jitter(size = 2) + 
    geom_smooth(method = "loess", se = TRUE)}) 

# plot as grid in 1 columns 
cowplot::plot_grid(plotlist = ggList, ncol = 1, 
        align = 'v', labels = levels(x$Server)) 

По предложению @Axeman, мы могли бы добавить ярлыки, используя facet_grid(~Server), вместо labels = levels(x$Server).

enter image description here

+1

Отлично. Если вы хотите отображать серые полосы гранётов, вы можете добавить '+ facet_grid (~ Server)'. Использование 'align = 'v'' в' plot_grid' даст приятный результат. – Axeman

+1

@Axeman хорошая точка о "v", спасибо, обновлено.Я хотел избежать использования грани, поэтому вместо этого использовалась метка. – zx8754

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