2017-12-28 17 views
5

Es fällt mir schwer, den Titel einer Legende relativ zu den Legendenschlüsseln zentriert auszurichten, wenn der Legendentitel lang ist. Es gibt eine Frage von a year ago, die für kurze Titel funktioniert, aber es scheint nicht für lange zu arbeiten.Legendentitel und Legendenschlüssel in ggplot2 für lange Legendentitel zentrieren

Beispiel, zunächst mit einem kurzen Legende Titel:

library(ggplot2) 
ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Petal.Width)) + geom_point(size = 3) + 
    scale_color_distiller(palette = "YlGn", type = "seq", direction = -1, 
         name = "A") + 
    theme(legend.title.align = 0.5) 

enter image description here

Alles wie erwartet wird, wird die Legende Titel über der Legende Schlüssel zentriert.

nun das gleiche mit einer langen Legende Titel:

ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Petal.Width)) + geom_point(size = 3) + 
    scale_color_distiller(palette = "YlGn", type = "seq", direction = -1, 
         name = "Long legend heading\nShould be centered") + 
    theme(legend.title.align = 0.5) 

enter image description here

Wir können sehen, dass der Text Zentrum selbst ausgerichtet ist, aber der Legende Schlüssel nicht relativ. Ich habe versucht, andere Themenoptionen wie legend.justification = "center" zu ändern, aber keiner scheint den Schlüssel von seiner Position ganz links in der Legendenbox zu verschieben.

Ein paar Kommentare:

  • ich vor die Entwicklungsversion von ggplot2, v2.2.1.9000 von ein paar Tage laufen.

  • Ich brauche speziell eine Lösung für eine kontinuierliche Farbpalette.

Antwort

4

müssten Sie den Quellcode ändern. Derzeit sind es computes the widths for the title grob and the bar+labels und left-justifies the bar+labels im Ansichtsfenster (gtable). Dies ist hart codiert.

+0

Dank, das ist, was ich war besorgt. Ich beginne damit, ein Problem zu lösen. –

+0

Probleme haben jedoch ihre eigenen Probleme; Wenn Sie es übertreiben, könnte es [unglückliche Folgen] geben (https://github.com/tidyverse/ggplot2/issues/816#issuecomment-35949082). – baptiste

+0

Ah, ich sehe, es muss mit einer Pull-Anfrage kommen. Vielleicht sehe ich dann für einen weiteren Tag nicht sofort, wie ich das beheben kann, ohne einen weiteren Theme-Parameter hinzuzufügen. –

1

Ich fand eine Lösung. Es erfordert etwas Graben in den Grob-Baum, und es kann nicht funktionieren, wenn es mehrere Legenden gibt, aber ansonsten scheint dies eine vernünftige Lösung, bis etwas Besseres kommt.

library(ggplot2) 
library(gtable) 
library(grid) 

p <- ggplot(iris, aes(x=Sepal.Length, y=Sepal.Width, color=Petal.Width)) + 
    geom_point(size = 3) + 
    scale_color_distiller(palette = "YlGn", type = "seq", direction = -1, 
         name = "Long legend heading\nShould be centered") + 
    theme(legend.title.align = 0.5) 

# extract legend 
g <- ggplotGrob(p) 
grobs <- g$grobs 
legend_index <- which(sapply(grobs, function(x) x$name) == "guide-box") 
legend <- grobs[[legend_index]] 

# extract guides table 
guides_index <- which(sapply(legend$grobs, function(x) x$name) == "layout") 
guides <- legend$grobs[[guides_index]] 

# add extra column for spacing 
# guides$width[5] is the extra spacing from the end of the legend text 
# to the end of the legend title. If we instead distribute it 50:50 on 
# both sides, we get a centered legend 
guides <- gtable_add_cols(guides, 0.5*guides$width[5], 1) 
guides$widths[6] <- guides$widths[2] 
title_index <- guides$layout$name == "title" 
guides$layout$l[title_index] <- 2 

# reconstruct legend and write back 
legend$grobs[[guides_index]] <- guides 
g$grobs[[legend_index]] <- legend 

grid.newpage() 
grid.draw(g) 

enter image description here

Verwandte Themen