2015-10-08 6 views
0

У меня проблема с окрашиванием текста легенды (каждое название группы с соответствующим цветом) в ggplot2. Это мой желаемый результат:ggplot2 легенда текст цвет

enter image description here

Я использую эти данные:

df <- data.frame(group = c("Group 1","Group 2","Group 3") 
       , value = c(1000000, 300000, 100000) 
       , value_format = c("1.000.000", "300.000", "100.000") 
       , weigth = c("71,4%", "21,4%", "7,14%") 
       , stringsAsFactors = F) 

lables <- paste(paste(df$group, df$value_format, sep = ": "), df$weigth, sep = "\n") 

И это код, с моей лучшей aproximation:

library(ggplot2) 
library(grid) 
library(extrafont) 

g <- ggplot(data=df, aes(x = 1, y = value, fill = factor(group))) 
g <- g + geom_bar(position="stack",stat="identity") 
g <- g + theme(
    plot.margin = unit(c(0, 0, 0, 0), "in") 
    , axis.line = element_blank() 
    , axis.text.x = element_blank() 
    , axis.text.y = element_blank() 
       , axis.ticks = element_blank() 
       , axis.title.x = element_blank() 
       , axis.title.y = element_blank() 
       , panel.background = element_blank() 
       , panel.border = element_blank() 
       , panel.grid.major = element_blank() 
       , panel.grid.minor = element_blank() 
       , plot.background = element_blank() 
       , legend.position="top" 
       , legend.title = element_blank() 
       , legend.text.align = .5 
       , legend.text = element_text(colour = c("#595959", "#E26B0A", "#00B0F0") 
              , family = "Arial" 
              , size = 11, face = "bold") 
       , legend.key.size = unit(0.5, "cm") 
       ) 
g <- g + scale_fill_manual(values=c("#595959", "#E26B0A", "#00B0F0"), 
         breaks=c("Group 1","Group 2","Group 3"), 
         labels=lables) 
g <- g + coord_flip() 
g 

С этого момента я являюсь не в состоянии сделать 3 вещи:

  1. цвет текста, соответствующий каждой группе (заметим, что я ввести вектор цветов внутри element_text для legend.text, но это занимает первое значение только
  2. Снимите legend.key (коробки с цветами)
  3. Распределить текст легенды над бар

Цените помощь

+1

Возможно, было бы легче забыть о легенде и использовать [аннотировать] (http://docs.ggplot2.org/0.9.3/annotate.html). – Axeman

+0

@Axeman, я новичок в ggplot, поэтому вам нужно его проверить! Но, кажется, хорошая идея. –

+0

Если у вас возникли проблемы с аннотацией вне области построения графика, посмотрите на пакет 'cowplot', который дает большую универсальность. – Axeman

ответ

0

Я решил проблему с помощью функции annotate как @Axeman предлагается ниже. Это мой последний код (с некоторыми трюками настройки):

library(ggplot2) 
library(grid) 
library(extrafont) 
g <- ggplot(data = df, aes(x = 1, y = value, fill = factor(group))) + 
    geom_bar(position = "stack", stat = "identity") + 
    theme(plot.margin = unit(c(.5, 0.2, 0, 0.1), "in") 
     , axis.line = element_blank() 
     , axis.text.x = element_blank() 
     , axis.text.y = element_blank() 
     , axis.ticks = element_blank() 
     , axis.title.x = element_blank() 
     , axis.title.y = element_blank() 
     , panel.background = element_blank() 
     , panel.border = element_blank() 
     , panel.grid.major = element_blank() 
     , panel.grid.minor = element_blank() 
     , plot.background = element_blank() 
     , legend.position=""   
     ) + 
    scale_fill_manual(values=c("#595959", "#E26B0A", "#00B0F0"), 
        breaks=c("Group 1","Group 2","Group 3"), 
        labels=lables) + 
    coord_flip() + 
    annotate("text", label=lables[1], x=1.8, y = df$value[1]/2   
       , fontface = "bold", color = "#595959", family="Arial", size = 4.5) + 
    annotate("text", label=lables[2], x=1.8, y = sum(df$value)-400000   
      , fontface = "bold", color = "#E26B0A", family="Arial", size = 4.5) + 
    annotate("text", label=lables[3], x=1.8, y = sum(df$value)-100000   
      , fontface = "bold", color = "#00B0F0", family="Arial", size = 4.5) 

g 

Thank's!

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