Jak zmienić tytuł legendy w ggplot

299

Mam następujący wątek jak poniżej. Został utworzony za pomocą tego polecenia:

library(ggplot2)

df <- data.frame(cond = factor(rep(c("A", "B"), each = 200)), 
                 rating = c(rnorm(200), rnorm(200, mean=.8)))

ggplot(df, aes(x=rating, fill=cond)) + 
geom_density(alpha = .3) +
xlab("NEW RATING TITLE") +
ylab("NEW DENSITY TITLE")

Teraz następną rzeczą, którą chcę zrobić, jest zmiana tytułu legendy z cond na NOWY TYTUŁ LEGENDU .

Więc po prostu dodałem następujący wiersz i dodaliśmy koniec powyższego kodu:

+labs(colour="NEW LEGEND TITLE")

Ale to nie działa. Jak to zrobić?

wprowadź opis zdjęcia tutaj

Neversaint
źródło
110
labs(fill="xyz")powinien zrobić
baptiste
1
@baptiste Wróciłem do tego pytania wiele razy, nie zauważając twojego komentarza, czy mógłbyś napisać to jako odpowiedź? IMO to najprostsze rozwiązanie i zasługuje na uznanie
User632716,
3
@ User632716 jest już w czyjejś odpowiedzi poniżej
baptiste
7
to nie działa ...
shenglih
1
Dla tych, którzy szukają odpowiedzi obejmującej wykresy z wieloma geom_instrukcjami, polecam odpowiedź na stackoverflow.com/a/38485985/1169233 , jest to jedyna, która działała dla mnie.
Waldir Leoncio

Odpowiedzi:

347

To powinno działać:

p <- ggplot(df, aes(x=rating, fill=cond)) + 
           geom_density(alpha=.3) + 
           xlab("NEW RATING TITLE") + 
           ylab("NEW DENSITY TITLE")
p <- p + guides(fill=guide_legend(title="New Legend Title"))

(lub alternatywnie)

p + scale_fill_discrete(name = "New Legend Title")
Bieg
źródło
10
Inną alternatywą jestp$labels$fill <- "New Legend Title"
Alex Holcombe,
3
jaka jest różnica między prowadnicami a skalą_dodatkową_dyskretą
Medhat
18
p$labels$fillnie działało dla mnie. Z ggplot2_2.1.0używamp$labels$colour <- "New legend title"
ClementWalter
4
p$labels$fill jest fajny, ale jeśli używasz więcej niż jednej zmiennej w estetyce (rodzaj linii, kolor, kształt) w aes, musisz zmienić je dla każdej osobno.
discipulus,
226

Nie zagłębiłem się w to, ale ponieważ użyłeś fill = cond w ggplot (),

 + labs(color='NEW LEGEND TITLE') 

mogło nie działać. Jakkolwiek zamienisz kolor na wypełnienie , to działa!

+ labs(fill='NEW LEGEND TITLE') 

To zadziałało dla mnie w ggplot2_2.1.0

Rohan Sadale
źródło
20
Myślę, że jest to najbardziej wymagająca odpowiedź, robi dokładnie to, o co prosi OP z jedną dodatkową linią
Leo
3
oba kolory = i wypełnienie = powinny działać. To jest „właściwa” odpowiedź na pytanie, IMO
Dan
3
to, czy zadziałałby kolor wypełnienia, zależy od tego, na co „mapowanie” (lub grupa w innych przypadkach) jest tak naprawdę odwzorowane. Dobre wyjaśnienie można znaleźć w cookbook-r.com/Graphs/Legends_(ggplot2)
1442363
3
To najlepsza odpowiedź.
Akshay Gaur,
1
Uwaga: w ggplot2 3.0+ to rozwiązanie nie działa: rozwiązane przezp + guides(fill=guide_legend(title="New Legend Title"))
Sumanth Lazarus
39

Ponieważ masz dwie gęstości, wyobrażam sobie, że możesz chcieć ustawić własne kolory scale_fill_manual.

Jeśli tak, możesz:

df <- data.frame(x=1:10,group=c(rep("a",5),rep("b",5)))

legend_title <- "OMG My Title"

ggplot(df, aes(x=x, fill=group)) + geom_density(alpha=.3) +   
    scale_fill_manual(legend_title,values=c("orange","red"))

wprowadź opis zdjęcia tutaj

użytkownik1317221_G
źródło
27

Żaden z powyższych kodów nie działał dla mnie.

Oto, co znalazłem i zadziałało.

labs(color = "sale year")

Możesz także podać spację między tytułem a wyświetlaczem, dodając \nna końcu.

labs(color = 'sale year\n")

Rohit Yadav
źródło
2
Czym różni się to od tej odpowiedzi ?
merv,
3
Tak, wypróbowałem każdy powyższy przykład i tylko ten działał dla mnie. Dzięki!
SummerEla,
Jak by to wyglądało, biorąc pod uwagę pierwotne pytanie, wydaje się, że fillzamiast color(lub colour) potrzebna jest? Biorąc pod uwagę czas pytania, możliwe jest, że jest on ggplot2związany z wersją.
steveb
1
@merv Główną różnicą jest to, że faktycznie działa.
Luís de Sousa
16

Ponieważ w kodzie użyłeś kiedyś ggplot(data, fill= cond)histogramu, musisz dodać tytuł legendy, używając również „wypełnienia” w sekcji etykiety, tj +labs(fill="Title name"). Jeśli używasz innego rodzaju wykresu, w którym kodem jest ggplot (dane, kolor = cond), możesz użyć +labs(colour= "Title Name"). Podsumowując, argument lab musi pasować do argumentu aes.

Kiedyś + guides(fill=guide_legend("my awesome title"))zmieniałem tytuł legendy na wykresach geom_bar, ale nie działało to dla geom_point.

kulianne
źródło
... ale dla geom_point()mnie to działa:guides(color=guide_legend("Type:"))
knb
1
@knb, twoja metoda działa:guides(color=guide_legend("Score Ranking:"))
bmc
1
Jak to się różni od tej odpowiedzi ?
mer
6

Jest jeszcze jedna bardzo prosta odpowiedź, która może działać w przypadku niektórych prostych wykresów.

Po prostu dodaj wywołanie do guide_legend () do swojego wykresu.

ggplot(...) + ... + guide_legend(title="my awesome title")

Jak pokazano w bardzo ładnych dokumentach ggplot .

Jeśli to nie zadziała, możesz dokładniej ustawić parametry przewodnika, dzwoniąc do przewodników :

ggplot(...) + ... + guides(fill=guide_legend("my awesome title"))

Możesz także zmieniać kształt / kolor / rozmiar, określając te parametry również dla swojego połączenia guides.

Yourpalal
źródło
26
Nie działało to dla mnie, ale qplot(…) + guides(color=guide_legend(title="sale year"))działało
Arnaud A
3

Aby dodać do listy (inne opcje tutaj nie działały dla mnie), możesz także użyć funkcji update_labels dla ggplot:

p <- ggplot(df, aes(x=rating, fill=cond)) + 
           geom_density(alpha=.3) + 
           xlab("NEW RATING TITLE") + 
           ylab("NEW DENSITY TITLE")
update_labels(p, list(colour="MY NEW LEGEND TITLE")

Umożliwi to również zmianę etykiet osi X i Y za pomocą osobnych linii:

update_labels(p, list(x="NEW X LABEL",y="NEW Y LABEL")
użytkownik3791304
źródło
2

Zauważyłem, że istnieją dwa sposoby zmiany / określenia legend.title dla ggboxplot ():

library(ggpubr)

bxp.defaultLegend <- ggboxplot(ToothGrowth, x = "dose", y = "len",
                               color = "dose", palette = "jco")

# Solution 1, setup legend.title directly in ggboxplot()
bxp.legend <- ggboxplot(ToothGrowth, x = "dose", y = "len",
                 color = "dose", palette = "jco", legend.title="Dose (mg)")

# Solution 2: Change legend title and appearnace in ggboxplot() using labs() and theme() option:
plot1 <-  bxp.defaultLegend + labs(color = "Dose (mg)") +
  theme(legend.title = element_text(color = "blue", size = 10), legend.text = element_text(color = "red"))

ggarrange(list(bxp.legend, bxp.defaultLegend, plot1), nrow = 1, ncol = 3,  common.legend = TRUE)

Kod jest modyfikowany na podstawie przykładu z GitHub .

Życzliwość
źródło
1

Korzystam z facet_wrap w moim ggplot i żadne z sugerowanych rozwiązań nie działało dla mnie oprócz rozwiązania ArnaudA:

qplot() + guides(color=guide_legend(title="sale year")) 
Birdonawire
źródło
1

Wiele osób spędza dużo czasu zmieniając etykiety, etykiety legend, tytuły i nazwy osi, ponieważ nie wiedzą, że można załadować tabele w R zawierające spacje " ". Możesz to jednak zrobić, aby zaoszczędzić czas lub zmniejszyć rozmiar kodu, określając separatory podczas ładowania tabeli, która jest na przykład rozdzielana tabulatorami (lub dowolnym separatorem innym niż domyślny lub pojedyncza spacja):

read.table(sep = '\t')

lub używając domyślnych parametrów ładowania formatu csv:

read.csv()

Oznacza to, że możesz zachować nazwę "NEW LEGEND TITLE"jako nazwę kolumny (nagłówek) w oryginalnym pliku danych, aby uniknąć podawania nowego tytułu legendy na każdym wykresie.

Nakx
źródło
-1

ggplot(df) + labs(legend = '<legend_title>')

Matthew Park
źródło