Edycja etykiet legendy (tekstu) w ggplot

120

Spędziłem godziny przeglądając dokumentację i StackOverflow, ale wydaje się, że żadne rozwiązanie nie rozwiązuje mojego problemu. Podczas korzystania ggplotnie mogę uzyskać prawidłowego tekstu w legendzie, mimo że znajduje się on w mojej ramce danych. Próbowałem scale_colour_manual, scale_fill_manualz różnymi wartościami, labels=np c("T999", "T888")", "cols".

Oto mój kod:

T999 <- runif(10, 100, 200)
T888 <- runif(10, 200, 300)
TY <- runif(10, 20, 30)
df <- data.frame(T999, T888, TY)


ggplot(data = df, aes(x=T999, y=TY, pointtype="T999")) + 
       geom_point(size = 15, colour = "darkblue") + 
       geom_point(data = df, aes(x=T888, y=TY), colour = 'red', size = 10 ) + 
       theme(axis.text.x = element_text(size = 20), axis.title.x =element_text(size = 20),   axis.text.y = element_text(size = 20)) +
       xlab("Txxx") + ylab("TY [°C]") + labs(title="temperatures", size = 15) + 
       scale_colour_manual(labels = c("T999", "T888"), values = c("darkblue", "red")) +    theme(legend.position="topright")

Pomoc byłaby bardzo mile widziana!

user3633161
źródło
8
Przyjrzeć się tej lekcji , aby dowiedzieć się, jaki format danych ggplotjest najbardziej zadowolony z (długa, nie szerokości), a także uzyskać poczucie różnicy między mapowanie się aesthetic do zmiennej w aesrozmowy vs. ustawienie go na zewnątrz aes. Musisz mieć meltswoje dane w długim formacie i zmapować colour(lub fill) w aesodpowiedniej zmiennej.
Henrik

Odpowiedzi:

146

Wspomniany samouczek @Henrik jest doskonałym źródłem informacji o tworzeniu wykresów za pomocą ggplot2pakietu.

Przykład z Twoimi danymi:

# transforming the data from wide to long
library(reshape2)
dfm <- melt(df, id = "TY")

# creating a scatterplot
ggplot(data = dfm, aes(x = TY, y = value, color = variable)) + 
  geom_point(size=5) +
  labs(title = "Temperatures\n", x = "TY [°C]", y = "Txxx", color = "Legend Title\n") +
  scale_color_manual(labels = c("T999", "T888"), values = c("blue", "red")) +
  theme_bw() +
  theme(axis.text.x = element_text(size = 14), axis.title.x = element_text(size = 16),
        axis.text.y = element_text(size = 14), axis.title.y = element_text(size = 16),
        plot.title = element_text(size = 20, face = "bold", color = "darkgreen"))

to skutkuje:

wprowadź opis obrazu tutaj

Jak wspomniał @ user2739472 w komentarzach: Jeśli chcesz zmienić tylko etykiety tekstu legendy, a nie kolory z domyślnej palety ggplot, możesz użyć scale_color_hue(labels = c("T999", "T888"))zamiast scale_color_manual().

Jaap
źródło
@Sathish Jak widać, tytuł na osi Y jest mniejszy niż tytuł na osi X. Różne rozmiary służą do zilustrowania możliwości i ich konsekwencji. Zatem kod użyty w odpowiedzi jest poprawny imo.
Jaap
@Sathish Dodając do mojego poprzedniego komentarza: z pewnością jest możliwość zrobienia tego w ten sposób! Wszystko zależy od tego, co chcesz osiągnąć ;-)
Jaap
9
Jeśli chcesz zmienić tylko etykiety tekstowe legendy, a nie kolory z domyślnej palety ggplot, możesz użyć scale_color_hue(labels = c("T999", "T888"))zamiastscale_color_manual()
user2739472
1
@ user2739472 Thx & true. Dodam to do mojej odpowiedzi.
Jaap
@Sathish Trochę się spóźniłem, ale teraz poprawiłem literówkę :-)
Jaap,
41

Tytuły legend można oznaczyć według określonej estetyki .

Można to osiągnąć za pomocą funkcji guides()lub labs()z ggplot2(więcej tutaj i tutaj ). Umożliwia dodawanie właściwości przewodnika / legendy przy użyciu estetycznego odwzorowania.

Oto przykład wykorzystujący mtcarszestaw danych i labs():

ggplot(mtcars, aes(x=mpg, y=disp, size=hp, col=as.factor(cyl), shape=as.factor(gear))) +
  geom_point() +
  labs(x="miles per gallon", y="displacement", size="horsepower", 
       col="# of cylinders", shape="# of gears")

wprowadź opis obrazu tutaj

Odpowiadając na pytanie PO za pomocą guides():

# transforming the data from wide to long
require(reshape2)
dfm <- melt(df, id="TY")

# creating a scatterplot
ggplot(data = dfm, aes(x=TY, y=value, color=variable)) + 
  geom_point(size=5) +
  labs(title="Temperatures\n", x="TY [°C]", y="Txxx") +
  scale_color_manual(labels = c("T999", "T888"), values = c("blue", "red")) +
  theme_bw() +
  guides(color=guide_legend("my title"))  # add guide properties by aesthetic

wprowadź opis obrazu tutaj

Megatron
źródło
Nie zgadzam się z tym. Podając tylko tytuł, łatwiej jest określić go w argumentach scale_ ..lub labs.
Jaap
Komentowałem Twoje rozwiązanie sprzed 15 minut, które dodało tytuł do scale_color_manual(title="...", ...). Widzę, że zmodyfikowałeś to, aby nawiązać do estetyki kolorów labs(). Oferuję swoje rozwiązanie jako alternatywę.
Megatron
Obecnie wydaje się, że modyfikuje to legendę, jeśli jest to gradient wypełnienia, aby był bardziej bezsensowny.
Max Candocia,