R: изменение формы данных для создания многострочного графика из разных переменных - PullRequest
0 голосов
/ 02 июля 2018

Мне нужно создать график с разными линиями от разных переменных.

Одна ось Y:

> a1
[1]   7  10  12  19  30  45  68 104 151 214 279 362 425 467 487 493 498 500
> a2
[1]   7  11  20  33  59  94 151 244 334 425 483 500
> a3
[1]   7  17  35  77 150 241 361 450 488 500
> a4
[1]   7  20  50 129 292 441 498 500
> a5
[1]   7  22  68 191 382 493 500

На оси X:

> b1
[1] 18
> b2
[1] 12
> b3
[1] 12
> b4
[1] 10
> b5
[1] 8

a1 и b1 должны быть одной строкой, a2 и b2 - другой и т. Д.

Как я могу подогнать данные к одному и тому же масштабу?

Как создать график, в который включены все линии?

Прямо сейчас, отдельные участки выглядят так: Example 1Example 2 Код, используемый для графиков, выглядит следующим образом:

plot(a1, type="l",col="red",xlim=c(1,b1),main="Example1", xlab="x", ylab = "y")
plot(a2,type="l",col="blue",xlim=c(1,b2),main="Example2", xlab="x", ylab = "y")

Requesttet dput ():

> dput(a1)
c(6, 8, 12, 20, 34, 54, 80, 110, 159, 214, 281, 345, 402, 447, 479, 492, 494, 498, 500)
> dput(b1)
19L
> dput(a2)
c(6, 12, 24, 42, 76, 127, 209, 306, 375, 441, 476, 495, 499,  499, 500)
> dput(b2)
15L

Как вы, вероятно, можете сказать, я очень новичок в использовании R.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Это действительно проблема получения данных в форме для их построения. Меня немного смущает то, с какими именно данными вы работаете, то есть, что такое b1, b2 и т. Д. Но с a1 и a2, которые вы опубликовали (и какими бы то ни было схожими векторами), вы должны поместить все в фрейм данных. Тот факт, что эти векторы имеют разную длину, не имеет значения, потому что ggplot в любом случае ожидает данные длинной формы. То есть, насколько я могу судить, a1 и a2 содержат разные наборы измерений одного и того же вида вещей (значения запасов, размер организма, вероятность какого-либо результата и т. Д.); поэтому в парадигме tidy-data они должны быть разными группами одной и той же переменной.

Итак, я сначала делаю фрейм / таблицу данных для каждого набора данных, давая им x, который представляет собой целые числа от 1 до любой длины его вектора a, а затем присваиваю ему маркер группы, чтобы я мог Держите каждый набор измерений прямо. Затем я связываю это в один фрейм данных.

library(tidyverse)

df1 <- tibble(
  a = c(6, 8, 12, 20, 34, 54, 80, 110, 159, 214, 281, 345, 402, 447, 479, 492, 494, 498, 500),
  x = 1:length(a),
  group = 1
)
df2 <- tibble(
  a = c(6, 12, 24, 42, 76, 127, 209, 306, 375, 441, 476, 495, 499,  499, 500),
  x = 1:length(a),
  group = 2
)
df <- bind_rows(df1, df2)
df
#> # A tibble: 34 x 3
#>        a     x group
#>    <dbl> <int> <dbl>
#>  1     6     1     1
#>  2     8     2     1
#>  3    12     3     1
#>  4    20     4     1
#>  5    34     5     1
#>  6    54     6     1
#>  7    80     7     1
#>  8   110     8     1
#>  9   159     9     1
#> 10   214    10     1
#> # ... with 24 more rows

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

ggplot(df, aes(x = x, y = a, color = as.factor(group), group = as.factor(group))) +
  geom_line()

Это масштабируется для любого количества наборов наблюдений, которые у вас есть - создавайте меньшие кадры данных для каждого a*, помечайте их как группу и объединяйте их все вместе.

0 голосов
/ 02 июля 2018

Как и во многих вещах ggplot, существует множество способов сделать это. Я думаю, что проще всего было бы сохранить все ваши векторы в одном data.frame / tibble, а затем обратиться к столбцам в отдельных вызовах geom_line. В приведенном ниже примере я выделил каждую строку разным цветом, чтобы было легче различать эти два.

library(tidyverse)

data <- tibble(a1 = c(1, 2 ,3, 4, 5), b1 = c(20), a2 = c(5, 6, 7, 8, 9), b2 = c(30))

ggplot(data = data) +
 geom_line(aes(x = a1, y = b1), color = "blue") +
 geom_line(aes(x = a2, y = b2), color = "red")

или с данными другой длины:

library(tidyverse)

data_1 <- tibble(a1 = c(1, 2 ,3, 4, 5), b1 = c(20)) 

data_2 <- tibble(a2 = c(5, 6, 7, 8, 9, 10, 11, 12), b2 = c(30))

ggplot() +
 geom_line(data = data_1, aes(x = a1, y = b1), color = "blue") +
 geom_line(data = data_2, aes(x = a2, y = b2), color = "red")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...