условие ifelse () не работает правильно для ggplot - PullRequest
0 голосов
/ 02 октября 2018

У меня есть данные, показанные ниже, которые я хочу построить с помощью ggplot:

> C
State        C1           C2
1   var1 -5.3458708  2.4959909437
2   var2 -5.1344963  2.4385834964
3   var3 -5.0972730  2.8425796581
4   var4  0.3743154 -0.2244166193
5   var5  0.4102937 -0.6597997849
6   var6  0.2252697 -0.2681201215
7   var7 -2.1813244  0.8744499423
8   var8 -2.1879480  0.9329252014
9   var9 -2.4635253  1.0975828789
10 var10 -3.1579603  1.3480216825
11 var11 -3.3255364  1.4333042550
12 var12 -3.0378333  1.2389625856
13 var13  4.4218140 -0.0897113458
14 var14  5.1222106  0.8949353025
15 var15  5.6032688  0.4346656081
16 var16  3.5892269 -0.1845360437
17 var17  3.9025834  0.0008319954
18 var18  3.6995580  0.1258706884
19 var19  0.4185548  0.5899289156
20 var20  0.4571535  0.1595539675
21 var21  0.6146784 -0.0438042841
22 var22  8.5871265  2.6205985329
23 var23  9.3172001  3.0164859344
24 var24  9.1885141  2.9251166107

Я хочу построить эти данные таким образом, чтобы, если C1 имеет большее значение, чем C2, точка данных на графике показываетзеленый цвет, и если C2 имеет большее значение, чем C1, то точка данных на графике показывает красный цвет.Код для достижения этого приведен ниже:

p <- ggplot(C, aes(C1, C2,label = State)) + 
  modelr::geom_ref_line(h = 0) +
  modelr::geom_ref_line(v = 0) +
  geom_point(aes(color= ifelse(c(abs(C$C1)) > c(abs(C$C2)), "green", "red"))) +
  guides(fill = guide_legend(reverse=TRUE)) +
  xlab("First Principal Component") +
  ylab("Second Principal Component") + 
  ggtitle("First Two Principal Components of my data")

p2 <- p + geom_text_repel(segment.color = NA)

Но условие ifelse () работает противоположно, т. Е. Дает красный цвет, где C1 имеет большее значение, чем C2, и наоборот, как показано на графике ниже, такжеэто можно увидеть из легенды: plot

Также я хочу изменить заголовок легенды на «Предполагаемый заголовок» и пометить как «Столбец1» для точек данных из C1 и «Столбец2».«для точек данных из C2.Как это возможно?

Я не пробовал ifelse () в aes () в первый раз, когда он использовался в пространственной экологии и R , а также в этом вопросе переполнения стека .

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

1 Ответ

0 голосов
/ 02 октября 2018

Возможно, вы могли бы попробовать что-то вроде этого:

library(tidyverse)
C %>% 
  mutate(color = if_else(abs(C1) > abs(C2), "Condition 1", "Condition 2")) %>% 
  ggplot(aes(x = C1, y = C2, label = State, color = color)) +
  geom_point() +
  scale_color_manual(
    values = c("Condition 1" = "green", "Condition 2" = "red"),
    name = "New title"
  ) +
  ggrepel::geom_text_repel(color = "black")

Операция if_else - это векторизованная команда, которая создает новую переменную на основе описанных выше условий.Запуск его до начала построения графика немного упрощает визуализацию происходящего.

...