Редактирование надписей легенды (текста) в 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")

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

user3633161
источник
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