Удаление нулей из GGplot - PullRequest
0 голосов
/ 19 марта 2020

В настоящее время у меня есть приведенный ниже график в R. Мне было интересно, можно ли закончить кривые, как только они достигнут нуля. Например, если z достигнет нуля, можно ли удалить линию и точки на графике после 10 ^ 4?

enter image description here

ydot.dplyr <- ydot.n0 %>% select(variables, variable, value) %>%
                group_by(variables) %>%
                do(as.data.frame(spline(x= .[["variable"]], y= .[["value"]], n = nrow(.)*10)))


ggplot(ydot.n0, aes(variable, value)) +
   geom_point(aes(colour = factor(variables))) +
   geom_line(data = ydot.dplyr, aes(x = x, y = y, colour = factor(variables)))

   variables variable        value
1          1     10^2   0.00000000
2          x     10^2   0.00000000
3          y     10^2  -2.98409634
4          z     10^2  -7.92656901
5         xx     10^2   0.78848436
6         xy     10^2   0.00000000
7         xz     10^2   0.00000000
8         yy     10^2   0.00000000
9         yz     10^2   0.00000000
10         1   10^2.5   0.00000000
11         x   10^2.5  -2.28064813
12         y   10^2.5   4.00588146
13         z   10^2.5 -10.72326346
14        xx   10^2.5   0.61528135
15        xy   10^2.5           NA
16        xz   10^2.5           NA
17        yy   10^2.5           NA
18        yz   10^2.5           NA
19         1     10^3   0.00000000
20         x     10^3  -0.01460549
21         y     10^3   5.26084263
22         z     10^3  -2.95040569
23        xx     10^3   0.00000000
24        xy     10^3   0.00000000
25        xz     10^3   0.00000000
26        yy     10^3   0.63388822
27        yz     10^3  -0.59157518
28         1   10^3.5   0.00000000
29         x   10^3.5  28.00000000
30         y   10^3.5  -1.00000000
31         z   10^3.5   0.00000000
32        xx   10^3.5   0.00000000
33        xy   10^3.5   0.00000000
34        xz   10^3.5  -1.00000000
35        yy   10^3.5   0.00000000
36        yz   10^3.5   0.00000000
37         1     10^4   0.00000000
38         x     10^4  28.00000000
39         y     10^4  -1.00000000
40         z     10^4   0.00000000
41        xx     10^4   0.00000000
42        xy     10^4   0.00000000
43        xz     10^4  -1.00000000
44        yy     10^4   0.00000000
45        yz     10^4   0.00000000
46         1   10^4.5   0.00000000
47         x   10^4.5  28.00000000
48         y   10^4.5  -1.00000000
49         z   10^4.5   0.00000000
50        xx   10^4.5   0.00000000
51        xy   10^4.5   0.00000000
52        xz   10^4.5  -1.00000000
53        yy   10^4.5   0.00000000
54        yz   10^4.5   0.00000000
55         1     10^5   0.00000000
56         x     10^5  28.00000000
57         y     10^5  -1.00000000
58         z     10^5   0.00000000
59        xx     10^5   0.00000000
60        xy     10^5   0.00000000
61        xz     10^5  -1.00000000
62        yy     10^5   0.00000000
63        yz     10^5   0.00000000

I ' отредактировал и добавил данные. Под «достижением нуля» я подразумеваю, что точки данных выше нуля больше не должны появляться на графике. Кроме того, данные должны появляться только тогда, когда они становятся ненулевыми.

Ответы [ 2 ]

1 голос
/ 19 марта 2020

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

library(tidyverse)

# fill NAs with 0, and convert x to numeric. This is for the spline calculation
ydot_filled <- ydot.n0 %>% mutate(value = zoo::na.fill(value, 0), x= as.numeric(as.factor(variable))) 

# I've changed your do call to lapply after splitting the data frame first, then binding back to create a new data frame. 
y_line <- lapply(split(ydot_filled, ydot.n0$variables), 
       function(u) as.data.frame(spline(x= u[["x"]], y= u[["value"]], n = nrow(u)*10))) %>%
  bind_rows(.id = 'variable') %>% 
  mutate(y = round(y,2)) %>% # helps avoid floating numbers
  group_by(variable) %>% 
  mutate(cum0 = cumsum(y == 0 )) %>% # this is to get the first 0
  filter(cum0 < 1) # remove all rows after first zero. Note some have value == 0 from the start

ggplot() +
  geom_point(data = ydot_filled, aes(x= x, y = value, colour = variables))  +
  geom_line(data = y_line, aes(x = x, y = y, colour = variable))

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

Создано в 2020-03-19 с помощью представительного пакета (v0.3.0)

Данные

# devtools::install_github("alistaire47/read.so")
ydot.n0 <- read.so::read.so("variables variable        value
1          1     10^2   0.00000000
2          x     10^2   0.00000000
3          y     10^2  -2.98409634
4          z     10^2  -7.92656901
5         xx     10^2   0.78848436
6         xy     10^2   0.00000000
7         xz     10^2   0.00000000
8         yy     10^2   0.00000000
9         yz     10^2   0.00000000
10         1   10^2.5   0.00000000
11         x   10^2.5  -2.28064813
12         y   10^2.5   4.00588146
13         z   10^2.5 -10.72326346
14        xx   10^2.5   0.61528135
15        xy   10^2.5           NA
16        xz   10^2.5           NA
17        yy   10^2.5           NA
18        yz   10^2.5           NA
19         1     10^3   0.00000000
20         x     10^3  -0.01460549
21         y     10^3   5.26084263
22         z     10^3  -2.95040569
23        xx     10^3   0.00000000
24        xy     10^3   0.00000000
25        xz     10^3   0.00000000
26        yy     10^3   0.63388822
27        yz     10^3  -0.59157518
28         1   10^3.5   0.00000000
29         x   10^3.5  28.00000000
30         y   10^3.5  -1.00000000
31         z   10^3.5   0.00000000
32        xx   10^3.5   0.00000000
33        xy   10^3.5   0.00000000
34        xz   10^3.5  -1.00000000
35        yy   10^3.5   0.00000000
36        yz   10^3.5   0.00000000
37         1     10^4   0.00000000
38         x     10^4  28.00000000
39         y     10^4  -1.00000000
40         z     10^4   0.00000000
41        xx     10^4   0.00000000
42        xy     10^4   0.00000000
43        xz     10^4  -1.00000000
44        yy     10^4   0.00000000
45        yz     10^4   0.00000000
46         1   10^4.5   0.00000000
47         x   10^4.5  28.00000000
48         y   10^4.5  -1.00000000
49         z   10^4.5   0.00000000
50        xx   10^4.5   0.00000000
51        xy   10^4.5   0.00000000
52        xz   10^4.5  -1.00000000
53        yy   10^4.5   0.00000000
54        yz   10^4.5   0.00000000
55         1     10^5   0.00000000
56         x     10^5  28.00000000
57         y     10^5  -1.00000000
58         z     10^5   0.00000000
59        xx     10^5   0.00000000
60        xy     10^5   0.00000000
61        xz     10^5  -1.00000000
62        yy     10^5   0.00000000
63        yz     10^5   0.00000000")
0 голосов
/ 20 марта 2020

Я не могу с легкостью использовать ваш набор данных, но из того, что я вижу, вы хотите построить только те точки, которые> (или равны) 0, верно? В этом случае это может быть довольно простое решение для вас. Я буду использовать фиктивный набор данных для значений +/- y:

df1 <- data.frame(x=seq(4, 10, by=0.1), y=cos(seq(4,10,by=0.1)), id='cos')
df2 <- data.frame(x=seq(4, 10, by=0.1), y=sin(seq(4,10,by=0.1)), id='sin')
df <- rbind(df1, df2)

При построении графика вы получите:

ggplot(df, aes(x,y)) + geom_line(aes(color=id))

enter image description here

Если вы хотите устранить какие-либо точки ниже y = 0, вы просто строите подмножество данных:

ggplot(df, aes(x,y)) + geom_line(data=subset(df,y>=0), aes(color=id))

enter image description here

Пределы Оси x и y можно изменить с помощью вызовов xlim() и ylim() на ваш участок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...