2016-11-20 1 views
0

Я работаю над этим вопросом here, чтобы получить легенду из подзаголовки 2х2 участков по всему окну. Цель состоит в том, чтобы получить одну легенду, а затем удалить другие легенды, достаточно только одной легенды, которая должна располагаться справа от всей панели.R: общая легенда от подзаголовка к панели 2x2 grid.arrange с решеткой

enter image description here

Может быть уместным

  1. Global legend using grid.arrange (gridExtra) and lattice based plots

Код

require(lattice) 
require(gridExtra) 

f<-function(x) as.double(as.character(x)) #factors converted to vectors https://stackoverflow.com/a/40680020/54964 

data.female <- structure(list(N11.1 = structure(c(3L, 3L), .Label = c("", "0.0", 
"1.0", "N11"), class = "factor"), N22.1 = structure(c(2L, 2L), .Label = c("", 
"0.0", "2.0", "N22"), class = "factor"), N33.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N33"), class = "factor"), N44.1 = structure(2:3, .Label = c("", 
"0.0", "0.1", "0.2", "N44"), class = "factor"), N21.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N21"), class = "factor"), N31.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N31"), class = "factor"), N32.1 = structure(c(5L, 
7L), .Label = c("", "0.0", "10.8", "11.0", "12.0", "17.0", "20.9", 
"22.8", "24.0", "3.0", "4.0", "44.0", "N32"), class = "factor")), .Names = c("N11.1", 
"N22.1", "N33.1", "N44.1", "N21.1", "N31.1", "N32.1"), row.names = c("Sinus", 
"Arr/AHB"), class = "data.frame") 

data.male <- structure(list(N11.1 = structure(c(3L, 3L), .Label = c("", "0.0", 
"1.0", "N11"), class = "factor"), N22.1 = structure(c(2L, 2L), .Label = c("", 
"0.0", "2.0", "N22"), class = "factor"), N33.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "N33"), class = "factor"), N44.1 = structure(c(2L, 
2L), .Label = c("", "0.0", "0.1", "0.2", "N44"), class = "factor"), 
    N21.1 = structure(c(2L, 2L), .Label = c("", "0.0", "N21"), class = "factor"), 
    N31.1 = structure(c(2L, 2L), .Label = c("", "0.0", "N31"), class = "factor"), 
    N32.1 = structure(c(11L, 9L), .Label = c("", "0.0", "10.8", 
    "11.0", "12.0", "17.0", "20.9", "22.8", "24.0", "3.0", "4.0", 
    "44.0", "N32"), class = "factor")), .Names = c("N11.1", "N22.1", 
"N33.1", "N44.1", "N21.1", "N31.1", "N32.1"), row.names = c("Sinus", 
"Arr/AHB"), class = "data.frame") 

ID<-c("Sinus","Arr/AHB") 

tl <- "female" 
p1 <- barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.female, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl 
     ) 
tl <- "male" 
p2 <- barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.male, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl 
     ) 

# Just repeat two barcharts more to get 2x2 example 
tl <- "female" 
p3 <- barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.female, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl 
     ) 
tl <- "male" 
p4 <- barchart(f(N11.1)+f(N22.1)+f(N33.1)+f(N44.1)+f(N21.1)+f(N31.1)+f(N32.1) ~ ID, 
     data=data.male, 
     auto.key=list(space='right'), 
     ylim=c(0,50), 
    beside=TRUE, 
    ylab = "Number of cases", 
    xlab = "Population/Sample", 
    main = tl) 



grid.arrange(p1,p2,p3,p4, ncol=2, nrow=2,left=("LEFT TITLE"),right=("RIGHT"),bottom=("BOTTOM"), top=("TOP")) 

, что компилирует производить вышеуказанные участки сетки, но следующий не работает из-за легенды

grid.arrange(p1,p2,p3,p4, ncol=2, nrow=2, 
     legend=list(space='right', 
     text=c("N11.1","N22.1","N33.1","N44.1","N21.1","N31.1","N32.1"), 
        columns=1)) 

где простым способом было бы наследовать легенду от некоторых сюжетных и использовать что-то вроде auto.key, но я не мог получить такой commond работает, пытаясь создать объект grop с командой легенды.

Что не так в команде легенды и есть ли какой-либо удобный способ унаследовать легенду о подзаголовках для всей панели, поэтому auto.key можно использовать во внешности панели?

Helper вопросы

  1. Как цвета получают в наследство от автоматической команды auto.key создания Глоб к легенде?

  2. Вместо того, чтобы вручную наклеивать этикетки с надписью (N11.1, N22.1, ...), как вы можете получить ее из подзаголовка?

+1

Решетка на самом деле не позволяет создать гроб без его рисования, поэтому немного извлечь легенду из графика, прежде чем рисовать его на устройстве. – baptiste

+0

@ baptiste, в каком направлении вы рекомендуете преодолеть это? – hhh

+1

лично я бы использовал фасетку и/или ggplot2. Но с решеткой я бы, вероятно, посмотрел на создание вещей с помощью низкоуровневых функций сетки, навигацию по видовым экранам после рисования, извлечение одной легенды как grob, повторное рисование ее в новом окне просмотра и т. Д. Болезненное, но возможно выполнимое. Или для одноразового использования, я бы, вероятно, использовал Illustrator для редактирования моего графика вручную. – baptiste

ответ

0

Я отправил ответ here. Идея состоит в том, чтобы не вставлять ключ в сюжет и использовать draw.key() для печати определенного ключа в любом месте на конечном участке сетки.

+0

Возможно, вам стоит просто пометить этот вопрос как ваш дубликат? –

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