Формат типа линии на основе 2 условий ggplot2 - PullRequest
0 голосов
/ 19 апреля 2019

Я строю графики на основе взаимной трансплантации (происхождение -> новый, происхождение -> происхождение) для 2 сайтов. Я хочу отформатировать тип линии для этих значений на основе истории, где origin -> origin - сплошная линия, а origin -> new - пунктирная линия. Для 2 сайтов значения «происхождение» и «новый» различны. Ниже приводится подмножество данных:

structure(list(FragID = c("1004", "1006", "1015", "1038", "1087", 
"1089", "1107", "1116"), ParentID = c("166", "166", "166", "166", 
"144", "144", "144", "144"), ParentSite.x = c("Inner Bay", "Inner 
Bay", "Inner Bay", "Inner Bay", "Outer Bay", "Outer Bay", "Outer 
Bay", "Outer Bay"), FragSite.x = c("Inner Bay", "Outer Bay", "Inner 
Bay", "Outer Bay", "Inner Bay", "Inner Bay", "Outer Bay", "Outer 
Bay"), TotalSA = c(0.0171970755726674, 0.0338197513082082, 
0.0215722601402604, 0.030712272182997, 0.027529366126288, 
0.029650482611575, 0.0316984120058258, 0.0356299659679559), T03SA = 
c(0.000709604810935872, 0.00148788795124323, 0.00109901406229665, 
0.000966259734683879, 0.000701528253168926, 0.000828107993427705, 
0.00079488114602085, 0.000904344998291552)), .Names = c("FragID", 
"ParentID", "ParentSite.x", "FragSite.x", "TotalSA", "T03SA"), 
class = "data.frame", row.names = c(2L, 3L, 5L, 9L, 21L, 22L, 28L, 
29L))

Я хочу, чтобы Внутренний залив -> Внутренний залив и Внешний залив -> Внешний залив - были сплошными линиями, а Внутренний залив -> Внешний залив и Внешний залив -> Внутренний залив - пунктирными линиями. То, что у меня есть, ниже:

GPBWM03 = ggplot(M3, aes(x = TotalSA, y = T03SA, 
                 group = interaction(FragSite.x, ParentSite.x), color = FragSite.x, 
                 linetype = ParentSite.x)) + 
  geom_point(alpha = 0.5, stroke = 0) +
  geom_smooth(method = "lm", formula = y~x, se = FALSE, fullrange = 
TRUE) + 
  scale_color_manual(values = c("Inner Bay" = "coral2", 
"Outer Bay" = "skyblue4"))

Ответы [ 3 ]

1 голос
/ 19 апреля 2019

Другой способ - создать дополнительную переменную, кодирующую linetype. В результате вы получаете легенду, которая показывает два фактора независимо:

M3 <- structure(list(FragID = c("1004", "1006", "1015", "1038", "1087", "1089", "1107", "1116"), 
                     ParentID = c("166", "166", "166", "166", "144", "144", "144", "144"), 
                     ParentSite.x = c("Inner Bay", "Inner Bay", "Inner Bay", "Inner Bay", "Outer Bay", "Outer Bay", "Outer Bay", "Outer Bay"), 
                     FragSite.x = c("Inner Bay", "Outer Bay", "Inner Bay", "Outer Bay", "Inner Bay", "Inner Bay", "Outer Bay", "Outer Bay"), 
                     TotalSA = c(0.0171970755726674, 0.0338197513082082, 0.0215722601402604, 0.030712272182997, 0.027529366126288, 0.029650482611575, 0.0316984120058258, 0.0356299659679559), 
                     T03SA = c(0.000709604810935872, 0.00148788795124323, 0.00109901406229665, 0.000966259734683879, 0.000701528253168926, 0.000828107993427705, 0.00079488114602085, 0.000904344998291552)), 
                     .Names = c("FragID", "ParentID", "ParentSite.x", "FragSite.x", "TotalSA", "T03SA"), 
                  class = "data.frame", row.names = c(2L, 3L, 5L, 9L, 21L, 22L, 28L, 29L))
M3$in.out <- interaction(M3$ParentSite.x, M3$FragSite.x)
M3$comb <- 'same'
M3$comb[which(M3$ParentSite.x!=M3$FragSite.x)] <- 'different'
GPBWM03 = ggplot(M3, aes(x = TotalSA, y = T03SA, 
                         group = interaction(FragSite.x, ParentSite.x), color = FragSite.x, 
                         linetype = comb)) + 
  geom_point(alpha = 0.5, stroke = 0) +
  geom_smooth(method = "lm", formula = y~x, se = FALSE, fullrange = 
                TRUE) + 
  scale_color_manual(values = c("Inner Bay" = "coral2", 
                                "Outer Bay" = "skyblue4"))
GPBWM03

enter image description here

0 голосов
/ 19 апреля 2019

Ваш dput имеет неправильный формат.Я вручную создал его, используя следующее:

df <- data.frame(FragID = c("1004", "1006", "1015", "1038", "1087", "1089", "1107", "1116"),
                 ParentID = c("166", "166", "166", "166", "144", "144", "144", "144"),
                 ParentSite.x = c("Inner Bay", "Inner Bay", "Inner Bay", "Inner Bay", "Outer Bay", "Outer Bay", "Outer Bay", "Outer Bay"),
                 FragSite.x = c("Inner Bay", "Outer Bay", "Inner Bay", "Outer Bay", "Inner Bay", "Inner Bay", "Outer Bay", "Outer Bay"),
                 TotalSA = c(0.0171970755726674, 0.0338197513082082, 0.0215722601402604, 0.030712272182997, 0.027529366126288, 0.029650482611575, 0.0316984120058258, 0.0356299659679559),
                 T03SA = c(0.000709604810935872, 0.00148788795124323, 0.00109901406229665, 0.000966259734683879, 0.000701528253168926, 0.000828107993427705, 0.00079488114602085, 0.000904344998291552))

Затем я добавил новый столбец к вашим данным, который определяет тип линии на основе взаимодействия ParentSite.x и FragSite.x с использованием пакета tidyverse:

df <- df %>%
  mutate(linetype = ifelse(ParentSite.x=='Inner Bay'&FragSite.x=='Inner Bay' | ParentSite.x=='Outer Bay'&FragSite.x=='Outer Bay'
                             , 'Matching', 'Not Matching'))

Затем строим график:

ggplot(df, aes(x = TotalSA, y = T03SA, color = FragSite.x, linetype = linetype)) + 
  geom_point(alpha = 0.5, stroke = 0) +
  geom_smooth(method = "lm", formula = y~x, se = FALSE, fullrange = TRUE) + 
  scale_color_manual(values = c("Inner Bay" = "coral2", 
                                "Outer Bay" = "skyblue4")) +
  labs(linetype='Line Type')

enter image description here

0 голосов
/ 19 апреля 2019

Это то, что вы ищете?

ggplot(M3,
       aes(
           x = TotalSA,
           y = T03SA,
           color = FragSite.x,
           linetype = interaction(ParentSite.x, FragSite.x)
       )) +
    geom_smooth(
        method = "lm",
        formula = y ~ x,
        se = FALSE,
        fullrange =
            TRUE
    ) +
    scale_linetype_manual(values = c(1, 2, 2, 1)) +
    scale_color_manual(values =
                           c("Inner Bay" = "coral2", "Outer Bay" = "skyblue4"))

Чтобы получить вывод как:

enter image description here

Это было сделано с использованием набора данных ниже, так как в некоторых значениях в исходном выводе dput выше были разрывы строк:

structure(list(FragID = c("1004", "1006", "1015", "1038", "1087", 
"1089", "1107", "1116"), ParentID = c("166", "166", "166", "166", 
"144", "144", "144", "144"), ParentSite.x = c("Inner Bay", "Inner Bay", 
"Inner Bay", "Inner Bay", "Outer Bay", "Outer Bay", "Outer Bay", 
"Outer Bay"), FragSite.x = c("Inner Bay", "Outer Bay", "Inner Bay", 
"Outer Bay", "Inner Bay", "Inner Bay", "Outer Bay", "Outer Bay"
), TotalSA = c(0.0171970755726674, 0.0338197513082082, 0.0215722601402604, 
0.030712272182997, 0.027529366126288, 0.029650482611575, 0.0316984120058258, 
0.0356299659679559), T03SA = c(0.000709604810935872, 0.00148788795124323, 
0.00109901406229665, 0.000966259734683879, 0.000701528253168926, 
0.000828107993427705, 0.00079488114602085, 0.000904344998291552
)), class = "data.frame", row.names = c(2L, 3L, 5L, 9L, 21L, 
22L, 28L, 29L))

Редактировать: Для комбинированной легенды может быть проще всего просто вручную назначить цвета в дополнение к типам линий:

ggplot(M3,
       aes(
           x = TotalSA,
           y = T03SA,
           color = interaction(ParentSite.x, FragSite.x),
           linetype = interaction(ParentSite.x, FragSite.x)
       )) +
    geom_smooth(
        method = "lm",
        formula = y ~ x,
        se = FALSE,
        fullrange =
            TRUE
    ) +
    scale_linetype_manual(name = "Combination", values = c(1, 2, 2, 1)) +
    scale_color_manual(name = "Combination", values = c("coral2", "coral2", "skyblue4", "skyblue4"))

Выход:

enter image description here

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

...