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!


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().


@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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.