Как изменить легенду ggplot2 для включения отрицательных и положительных значений? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь создать негативную и позитивную легенду вместо того, что у меня есть. Ниже приведен мой воспроизводимый код:

library(ggplot2)

YEAR <- c(1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969)
ATL <- c(0.9814819, 0.6158561, 0.1594867, -1.324053, -0.5223706,
         0.4015643, -1.255614, 0.6481795, 0.1342264, -0.507981)
OBS <- c(-0.2040433, -0.2014844, -0.39053, 0.5320961, -0.870454,
         0.7047542, 1.069224, -0.217602, 0.3252735, 1.419028)
GLOB_OBS_SVD <- c(-0.1309537, -1.074651, 2.5286819, 1.4785519, 0.061268,
                  -2.547872, -1.171241, -0.3161392, 0.4983722, -0.7510358)

PC1 <- data.frame(YEAR, ATL, OBS, GLOB_OBS_SVD)

PC1$GLOB_OBS_SVD <- PC1$GLOB_OBS_SVD*-1.0

PC1$DOT_SIZE <- ifelse(PC1$GLOB_OBS_SVD < 0.5 & PC1$GLOB_OBS_SVD > -0.5, 0, 
                       ifelse(PC1$GLOB_OBS_SVD < 1.5 & PC1$GLOB_OBS_SVD > -1.5, 1,
                              ifelse(PC1$GLOB_OBS_SVD < 2.5 & PC1$GLOB_OBS_SVD > -2.5, 2, 3
                              )))

PC1$COLOR <- ifelse(PC1$GLOB_OBS_SVD < 0, "deepskyblue", "tomato")

ggplot(PC1, aes(x=ATL, y=OBS)) +
  geom_point(aes(size=DOT_SIZE, color=COLOR)) + 
  scale_size(name = "SVD TS Value", 
             labels = c("-0.5<x<0.5", "0.5<x<1.5 & -0.5<x<-1.5", 
                        "1.5<x<2.5 & -1.5<x<-2.5", "x<-2.5 & x>2.5")) +
  scale_color_manual(values = c("deepskyblue", "tomato"), 
                     labels = c("Negative", "Positive")) +
  labs(color = "SVD TS Value") +
  labs(x = "CESM ATL Nino 4 Index", y = "OBS Nino 4 Index") +
  geom_text(aes(label=YEAR), hjust=0.5, vjust = 0, size = 2.5, angle = 0) +
  theme(plot.title = element_text(hjust = 0.5))

Который производит этот участок

Scatterplot

Но я бы хотел, чтобы моя легенда выглядела так, как будто у меня беспорядок:

Legend I want

1 Ответ

0 голосов
/ 09 мая 2018

Если у вас все в порядке с ярлыками на одной стороне клавиш легенды, а не на обеих (что я нахожу странным в любом случае), это возможно с существующим кодом легенды.Вам просто нужно вручную определить нужные разрывы и метки.

df <- data.frame(x = c(-3, -2, -0.5, 1, 2, 5))

ggplot(df, aes(x, x, size = abs(x),
               color = ifelse(x>=0, "pos", "neg"))) + 
  geom_point() + 
  scale_color_manual(values = c("deepskyblue", "tomato"), guide = "none") +
  scale_size(breaks = c(5, 3, 1, 1, 3, 5),
             labels = c("5", "3", "1", "-1", "-3", "-5"),
             name = "value") +
  guides(size = guide_legend(
    override.aes = list(color = c(rep("tomato", 3), rep("deepskyblue", 3)))
    )
  )

enter image description here

...