Редактирование надписей легенды (текста) в ggplot


120

Я часами просматривал документацию и StackOverflow, но, похоже, мне не удалось решить проблему. При использовании ggplotя не могу получить правильный текст в легенде, даже если он находится в моем фрейме данных. Я пробовал scale_colour_manual, scale_fill_manualс разными значениями , labels=например , как c("T999", "T888")", "cols".

Вот мой код:

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")

Помощь будет очень признательна!


8
Посмотрите на этом уроке , чтобы узнать, какой формат данных ggplotявляется самым счастливым (долго, не в ширину), и получить ощущение разницы между отображением в aesтетический переменной в aesвызове, против установки его снаружи aes. Вам необходимо meltпреобразовать данные в длинный формат и сопоставить colour(или fill) aesс соответствующей переменной.
Хенрик

Ответы:


146

Упомянутый учебник @Henrik - отличный ресурс для изучения того, как создавать графики с помощью ggplot2пакета.

Пример с вашими данными:

# 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"))

это приводит к:

введите описание изображения здесь

Как упомянул @ user2739472 в комментариях: если вы хотите изменить только текстовые метки легенды, а не цвета из палитры по умолчанию ggplot, вы можете использовать scale_color_hue(labels = c("T999", "T888"))вместо scale_color_manual().


@Sathish Как видите, заголовок оси Y меньше, чем заголовок оси x. Различные размеры используются для иллюстрации возможностей и последствий. Таким образом, код, использованный в ответе, верен imo.
Jaap

@Sathish Добавление к моему предыдущему комментарию: это, безусловно, вариант сделать это таким образом! Все зависит от того, чего вы хотите достичь ;-)
Jaap

9
Если вы хотите изменить только текстовые метки легенды, а не цвета из палитры по умолчанию ggplot, вы можете использовать scale_color_hue(labels = c("T999", "T888"))вместоscale_color_manual()
user2739472

1
@ user2739472 Спасибо, правда. Добавлю к своему ответу.
Jaap

@Sathish Я немного опоздал, но исправил опечатку сейчас :-)
Jaap

41

Названия легенд могут быть помечены определенной эстетикой .

Этого можно добиться с помощью функций guides()или labs()из ggplot2(подробнее здесь и здесь ). Он позволяет добавлять свойства направляющих / легенд с помощью эстетического сопоставления.

Вот пример использования mtcarsнабора данных и 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")

введите описание изображения здесь

Отвечая на вопрос OP, используя 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

введите описание изображения здесь


Я не согласен с этим. Когда указывается только заголовок, его проще указать в аргументах scale_ ..или labs.
Jaap

Я комментировал ваше решение 15 минут назад, добавив заголовок в scale_color_manual(title="...", ...). Я вижу, вы изменили его, чтобы отсылать к эстетике цвета labs(). Предлагаю свое решение как альтернативу.
Megatron

На данный момент это, похоже, изменяет легенду, если это градиент заливки, чтобы быть более бессмысленным.
Max Candocia
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.