2013-10-06 10 views
7

Ho generato una trama semplice in R (versione R versione 3.0.1 (2013-05-16)) utilizzando ggplot2 (versione 0.9.3.1) che mostra i coefficienti di correlazione per un insieme di dati. Attualmente, la barra colori della legenda sul lato destro del grafico è una frazione dell'intera dimensione del grafico.Come posso rendere la legenda in ggplot2 della stessa altezza del mio plot?

Vorrei che la barra dei colori della legenda fosse uguale all'altezza della trama. Ho pensato che avrei potuto usare lo legend.key.height per farlo, ma ho scoperto che non è il caso. Ho studiato la funzione unit del pacchettoe ho scoperto che c'erano alcune unità normalizzate, ma quando le ho provate (unit(1, "npc")), la barra dei colori era troppo alta e usciva dalla pagina.

Come si può rendere la legenda della stessa altezza della trama stessa?

Un auto piena conteneva esempio è qui sotto:

# Load the needed libraries 
library(ggplot2) 
library(grid) 
library(scales) 
library(reshape2) 

# Generate a collection of sample data 
variables = c("Var1", "Var2", "Var3") 
data = matrix(runif(9, -1, 1), 3, 3) 
diag(data) = 1 
colnames(data) = variables 
rownames(data) = variables 

# Generate the plot 
corrs = data 
ggplot(melt(corrs), aes(x = Var1, y = Var2, fill = value)) + 
    geom_tile() + 
    geom_text(parse = TRUE, aes(label = sprintf("%.2f", value)), size = 3, color = "white") + 
    theme_bw() + 
    theme(panel.border = element_blank(), 
     axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1), 
     aspect.ratio = 1, 
     legend.position = "right", 
     legend.key.height = unit(1, "inch")) + 
     labs(x = "", y = "", fill = "", title = "Correlation Coefficients") + 
     scale_fill_gradient2(limits = c(-1, 1), expand = c(0, 0), 
          low = muted("red"), 
          mid = "black", 
          high = muted("blue")) 

enter image description here

+2

prega di inviare un minimo esempio riproducibile autonomo – baptiste

+0

Will fare poco .... –

+0

Ok, domanda a cura di avere un esempio eseguibile completo –

risposta

1

Sembra abbastanza difficile, il più vicino ho ottenuto è stato questo,

## panel height is 1null, so we work it out by subtracting the other heights from 1npc 
## and 1line for the default plot margins 

panel_height = unit(1,"npc") - sum(ggplotGrob(plot)[["heights"]][-3]) - unit(1,"line") 
plot + guides(fill= guide_colorbar(barheight=panel_height)) 

purtroppo la giustificazione verticale è un po ' off.

+0

Abbastanza durned vicino .... Forse un po ' più tweaking ma sono andato avanti e contrassegnato come risposta. Grazie per i suggerimenti. –

9

Questo è caotico, ma basato su this answer e scavando più in profondità nel ggplot grob, la legenda può essere posizionata con precisione.

# Load the needed libraries 
library(ggplot2) 
library(gtable) # 
library(grid) 
library(scales) 
library(reshape2) 

# Generate a collection of sample data 
variables = c("Var1", "Var2", "Var3") 
data = matrix(runif(9, -1, 1), 3, 3) 
diag(data) = 1 
colnames(data) = variables 
rownames(data) = variables 

# Generate the plot 
corrs = data 
plot = ggplot(melt(corrs), aes(x = Var1, y = Var2, fill = value)) + 
    geom_tile() + 
    theme_bw() + 
    theme(panel.border = element_blank()) + 
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1)) + 
    theme(aspect.ratio = 1) + 
    # theme(legend.position = "right", legend.key.height = unit(1, "inch")) + 
    labs(x = "", y = "", fill = "", title = "Correlation Coefficients") + 
    scale_fill_gradient2(limits = c(-1, 1), breaks = c(-1, -.5, 0, .5, 1), expand = c(0,0), 
     low = muted("red"), mid = "black", high = muted("blue")) + # Modified line 
    geom_text(parse = TRUE, aes(label = sprintf("%.2f", value)), size = 3, color = "white") + 
    scale_x_discrete(expand = c(0,0)) + # New line 
    scale_y_discrete(expand = c(0,0)) # New line 
plot 

# Get the ggplot grob 
gt = ggplotGrob(plot) 

# Get the legend 
leg = gtable_filter(gt, "guide-box") 

# Raster height 
leg[[1]][[1]][[1]][[1]][[1]][[2]]$height = unit(1, "npc") 

# Positions for labels and tick marks - five breaks, therefore, five positions 
pos = unit.c(unit(0.01,"npc"), unit(.25, "npc"), unit(.5, "npc"), unit(.75, "npc"), unit(.99, "npc")) 

# Positions the labels 
leg[[1]][[1]][[1]][[1]][[1]][[3]]$y = pos 

# Positions the tick marks 
leg[[1]][[1]][[1]][[1]][[1]][[5]]$y0 = pos 
leg[[1]][[1]][[1]][[1]][[1]][[5]]$y1 = pos 

# Legend key height ? 
leg[[1]][[1]][[1]][[1]]$heights = unit.c(rep(unit(0, "mm"), 3), 
             unit(1, "npc"), 
             unit(0, "mm")) 
# Legend height 
leg[[1]][[1]]$heights[[3]] = sum(rep(unit(0, "mm"), 3), 
           unit(1, "npc"), 
           unit(0, "mm")) 

# grid.draw(leg) # Check on heights and y values 

# gtable_show_layout(gt) # Manually locate position of legend in layout 
gt.new = gtable_add_grob(gt, leg, t = 6, l = 8) 

# Draw it 
grid.newpage() 
grid.draw(gt.new) 

enter image description here

Problemi correlati