2013-07-10 6 views
3

Я заинтересован в создании простых угловых меток для многочастной фигуры, которую я готовлю в ggplot. This is similar to this previously asked question, но ответы только объяснили, как включить ярлык в верхней части сюжета, а не создавать угловую метку в формате, требуемом многими журналами. Я надеюсь воспроизвести что-то похожее на функцию plotrixcorner.label() в ggplot2.Угловые метки в ggplot2

Вот пример использования plottrix того, что я хотел бы воссоздать в ggplot2.

require(plotrix) 

foo1<-rnorm(50,25,5) 
foo2<-rpois(50,25) 
foo3<-rbinom(50,25,0.5) 
foo4<-rnbinom(50,25,0.5) 

par(mfrow=c(2,2)) 
hist(foo1) 
corner.label(label='a',figcorner=T) 
hist(foo2) 
corner.label(label='b',figcorner=T) 
hist(foo3) 
corner.label(label='c',figcorner=T) 
hist(foo4) 
corner.label(label='d',figcorner=T) 

Это производит следующее:

enter image description here

Спасибо за любую помощь заранее!

+0

Можете ли вы прояснить, как именно должна выглядеть маркировка? Вам просто нужны метки фасета, которые все толкают влево? Или вам нужно полностью удалить ленту метки фасета? – joran

+0

Мне просто нужно оправдать ярлыки в верхнем левом углу каждой панели. Я не уверен, что вы имеете в виду, удалив ленту метки фасета. – Thraupidae

+0

Хорошо, тогда посмотрите '? Theme' и установите hjust для' strip.text'. – joran

ответ

5

Я имел такую ​​же проблему и придумал следующее решение, которое немного отличается:

загрузки г пакетов

library(ggplot2) 
library(grid) 
library(gridExtra) 

данные примера

a <- 1:20 
b <- sample(a, 20) 
c <- sample(b, 20) 
d <- sample(c, 20) 

создать рамку

mydata <- data.frame(a, b, c, d) 

данных создают примера приведены зависимости

myplot1 <- ggplot(mydata, aes(x=a, y=b)) + geom_point() 
myplot2 <- ggplot(mydata, aes(x=b, y=c)) + geom_point() 
myplot3 <- ggplot(mydata, aes(x=c, y=d)) + geom_point() 
myplot4 <- ggplot(mydata, aes(x=d, y=a)) + geom_point() 

набор углу этикетки

myplot1 <- arrangeGrob(myplot1, top = textGrob("A", x = unit(0, "npc") 
     , y = unit(1, "npc"), just=c("left","top"), 
     gp=gpar(col="black", fontsize=18, fontfamily="Times Roman"))) 

myplot2 <- arrangeGrob(myplot2, top = textGrob("B", x = unit(0, "npc") 
     , y = unit(1, "npc"), just=c("left","top"), 
     gp=gpar(col="black", fontsize=18, fontfamily="Times Roman"))) 

myplot3 <- arrangeGrob(myplot3, top = textGrob("C", x = unit(0, "npc") 
     , y = unit(1, "npc"), just=c("left","top"), 
     gp=gpar(col="black", fontsize=18, fontfamily="Times Roman"))) 

myplot4 <- arrangeGrob(myplot4, top = textGrob("D", x = unit(0, "npc") 
     , y = unit(1, "npc"), just=c("left","top"), 
     gp=gpar(col="black", fontsize=18, fontfamily="Times Roman"))) 

черчения все участки на одной странице

grid.arrange(myplot1, myplot2, myplot3, myplot4, ncol = 2) 

corner label

+0

Это замечательно. Это намного проще и более общеприменимо и проще реализовать, чем принятое решение IMO. Благодаря! –

4

Пример:

d <- data.frame(x = runif(16), 
       y = runif(16), 
       grp = rep(letters[1:4],each = 4)) 

ggplot(d,aes(x = x,y = y)) + 
facet_wrap(~grp) + 
geom_point() + 
theme(strip.text = element_text(hjust = -0.05), 
     strip.background = element_blank()) 

enter image description here

+0

Есть ли способ иметь ярлыки вне участка/оси? Как и опция figcorner = T в corner.label()? – Thraupidae

+0

@Thraupidae Вы можете установить, что 'hjust' будет отрицательным, но затем b и d будут дрейфовать в другие панели. – joran

+0

@Thraupidae См. Мое редактирование. Я думаю, что это ближе к тому, что тебе нужно. (И должен объяснить, почему я спросил о лентах с гранями.) – joran

1

Вот решение, используя пользовательскую функцию этикетировочные. Это не вызывает никаких манипуляций с данными. В настоящее время он работает только с одномерными гранями (facet_wrap). Я все еще работаю на том, чтобы увеличить вдоль 2-D сетке ...

  1. Определим функцию этикетировочные

    make_labelstring <- function(mypanels) { 
        mylabels <- sapply(mypanels, 
            function(x) {LETTERS[which(mypanels == x)]}) 
    
        return(mylabels) 
    } 
    
    label_panels <- ggplot2::as_labeller(make_labelstring) 
    
  2. Pass label_panels как этикетировочной к facet_wrap

    library(ggplot2) 
    data("diamonds") 
    
    # create a faceted plot 
    ggplot(data = diamonds, aes(x = depth, y = price)) + 
        geom_point() + 
        facet_wrap(~cut, labeller = label_panels) + 
        theme(strip.text = element_text(hjust = -0), 
         strip.background = element_blank()) 
    
Смежные вопросы