Построение n столбцов фрейма данных в виде строк с ggplot в r - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь воссоздать модель урны Поля (https://en.wikipedia.org/wiki/Pólya_urn_model) в R, с ggplot. Модель в основном начинается с 1 белого и 1 черного шара в урне, случайным образом выбирает один шар и кладет его обратновместе с шариком того же цвета. Я делаю это в R, скажем, 10 итераций (поэтому 10 раз вынимаем один шарик и кладем обратно вместе с другим шариком того же цвета). И я запускаю это, скажем, 5 раз., я получаю фрейм данных из 5 столбцов (= для каждого прогона) и 10 строк (= для итераций).

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

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

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

my data frame looks like this:
          V1         V2         V3        V4 id
1  0.3333333 0.33333333 0.33333333 0.3333333  1
2  0.5000000 0.25000000 0.25000000 0.2500000  2
3  0.4000000 0.20000000 0.20000000 0.4000000  3
4  0.3333333 0.16666667 0.16666667 0.3333333  4
5  0.2857143 0.14285714 0.14285714 0.2857143  5
6  0.2500000 0.12500000 0.12500000 0.3750000  6
7  0.2222222 0.11111111 0.11111111 0.3333333  7
8  0.2000000 0.10000000 0.10000000 0.3000000  8
9  0.1818182 0.09090909 0.09090909 0.2727273  9
10 0.2500000 0.08333333 0.08333333 0.2500000 10

, но для упрощения вот несколько тестовых кодов:

V1 <- rnorm(10, 0.5, 0.1)
V2 <- rnorm(10, 0.5, 0.1)
V3 <- rnorm(10, 0.5, 0.1)
V4 <- rnorm(10, 0.5, 0.1)
df <- data.frame(V1, V2, V3, V4)

Мой код для ggplot следующий:

library(reshape2)
df$id = row.names(df) # add id to each row 
df_long = melt(df, id.vars = "id")  # reshape the data into long format

только эта первая версияпоказывает точки

ggplot(df_long, aes(x = value, y = id, color = variable)) + 
geom_point() 

, и эта версия каким-то образом запутывает строки, и я не могу понять, почему.

ggplot() + geom_line(data = df_long, aes(x = value, y = id, color = variable, group = variable)) + xlab("x axis") +  ylab("y axis")

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

РЕДАКТИРОВАТЬ: Под «испорченным» я имею в виду, что вместо построения одной строки за цикл (которую я хочу получить), точки данныхкажется, теряют, к какому испытанию / пробежке они принадлежат.Таким образом, вместо того, чтобы получать одну линию за цикл / пробную версию, я получаю больше линий, из которых некоторые соединяют только 2-3 точки и часто соединяют точки из разных серий.Надеюсь, мои объяснения достаточно ясны.

Ответы [ 2 ]

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

Это, кажется, соединяет их всех правильно, если я вас правильно понял.Пожалуйста, проверьте, правильно ли это.

df$id = 1:nrow(df)
final_data <- melt(df, id='id')
names(final_data) <- c('id', 'func', 'value')

ggplot() + geom_line(data = final_data, aes(x = id, y = value, color = func, group = func), size = 1)

Выход:

          V1        V2        V3        V4 id
1  0.4656275 0.4846357 0.4613710 0.5885883  1
2  0.4312952 0.4929042 0.5499502 0.5133333  2
3  0.5890201 0.4652452 0.5598206 0.4789956  3
4  0.7108441 0.4143140 0.5738660 0.4073124  4
5  0.6374072 0.6671785 0.5111608 0.4475132  5
6  0.4797948 0.6191391 0.5423101 0.4472512  6
7  0.5868793 0.5601147 0.4369428 0.5696494  7
8  0.5169970 0.4398982 0.5137524 0.3923140  8
9  0.3960616 0.3552303 0.4174657 0.4449402  9
10 0.5222120 0.5028562 0.5760920 0.4310323 10

enter image description here

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

Используя ваш df, вы можете сделать что-то подобное:

library(tidyverse)

# I use 'gather' instead of 'melt'
df_long = df %>% 
  mutate(id = 1:nrow(.)) %>% 
  gather(id.vars, values, -id) 

df_long %>% 
  ggplot(aes(x = values, y = id, group = id.vars, color = id.vars)) + 
  geom_line(size = 1) 

![enter image description here]

Obs.:

если вы set.seed(...) мы можемскопируйте ваш df объект.

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