2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Хелп! R: накопление графиков в цикле
Сообщение24.09.2022, 10:19 
Заслуженный участник
Аватара пользователя


22/01/11
2641
СПб
Что-то я базовое не понимаю про то, что такое данные в R (и вообще в программировании)

Вот строку
Код:
ggplot()+geom_line(aes(1:100,cumsum(runif(100,0,1))/1:100))+geom_line(aes(1:100,cumsum(runif(100,0,1))/1:100))

R понимает прекрасно, рисует два графика. Но вот после выполнения скрипта
Код:
gr<-ggplot()
N=100
for (k in 1:3) {
x<-runif(N,0,1)
y<-cumsum(x)/1:length(x)
gr<- gr+geom_line(aes(1:length(x),y))
}
gr

рисует только один график, последний. Чем же "сложение" графиков внутри цикла отличается от "сложения" в строке? Как мне построить три графика по данным, формируемым в цикле?

 Профиль  
                  
 
 Re: Хелп! R: накопление графиков в цикле
Сообщение25.09.2022, 15:41 
Заслуженный участник


12/07/07
4529
Сгенерируем сначала координаты
Код:
cc <- c('green', 'red', 'blue')
N=100
X <- matrix(nrow=3,ncol=N)
Y <- matrix(nrow=3,ncol=N)
gr <- vector(mode = 'expression', length=3)
for (k in 1:3) {
X[k,]<-runif(N,0,1)
Y[k,]<-cumsum(X[k,])/1:N
}
Затем выполним
Код:
gr <- ggplot()
gr <- gr + geom_line(aes(X[1,], Y[1,]), color=cc[1])
gr <- gr + geom_line(aes(X[2,], Y[2,]), color=cc[2])
gr <- gr + geom_line(aes(X[3,], Y[3,]), color=cc[3])
И получим три графика на одном рисунке.
Вложение:
Комментарий к файлу: R version 3.6.3
pic.png
pic.png [ 13.53 Кб | Просмотров: 0 ]

Если же в цикле выполнять «добавление» линий
Код:
gr <- ggplot()
k <- 1
gr <- gr + geom_line(aes(X[k,], Y[k,]), color=cc[1])
k <- 2
gr <- gr + geom_line(aes(X[k,], Y[k,]), color=cc[2], alpha = 0.0)
То в первом графике координаты будут заменены на координаты второго графика и в результате будет построено два графика по одним координатам. Это можно проверить меняя значение прозрачности (alpha).

Upd. По-простому, если ничего от пакета ggplot2 не надо и нужно в цикле выводить графики, то можно просто добавить сортировку и выводить первый график при помощи plot, а последующие при помощи lines.

 Профиль  
                  
 
 Re: Хелп! R: накопление графиков в цикле
Сообщение25.09.2022, 21:25 
Заслуженный участник
Аватара пользователя


22/01/11
2641
СПб
Понятно... наверное. А нельзя ли
GAA в сообщении #1565387 писал(а):
Затем выполним

тоже в цикле сделать?

-- Вс сен 25, 2022 21:31:22 --

сформировать массив N=10 цветов вручную не так трудно, а вот десять строк по трафарету уже как-то много места

-- Вс сен 25, 2022 21:36:09 --

кстати, x -- вспомогательный массив, график-то мне нужен y[n], но это не влияет на ценность вашей подсказки:)

 Профиль  
                  
 
 Re: Хелп! R: накопление графиков в цикле
Сообщение26.09.2022, 14:56 
Заслуженный участник


12/07/07
4529
Я упростил пример переопределения в предыдущем своём сообщении.

alcoholist в сообщении #1565408 писал(а):
кстати, x -- вспомогательный массив, график-то мне нужен y[n],
Тогда мне совсем не видно смысла в пакете ggplot2
Пусть, для простоты, в цикле находятся значения синусоиды и выводятся на рисунок.
Код:
cc <- c('green', 'red', 'blue')
N=100
n = 1:100;
for (k in 1:3) {
Y <- 1/k*sin(n)
if (k == 1) plot(n, Y, type = 'l', col=cc[k]) else lines(n, Y, col=cc[k])
Получаем три графика на одном рисунке. Можно сделать и 10.
Вложение:
pic3A.png
pic3A.png [ 11.22 Кб | Просмотров: 900 ]

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

Upd (28.09.22) В моей версии R 3.6.3 при использовании ggplot2 в цикле происходит переопределение графиков и на рисунке виден только один. Например, так происходит в случае
Код:
cc <- c('green', 'red', 'blue')
N=100
gr <- ggplot()
Y <- matrix(nrow=3,ncol=N)
n = 1:N;
for (k in 1:3) {
Y[k, ] <- 1/k*sin(n)
gr <- gr + geom_line(aes(x=n, y=Y[k, ]), color=cc[k])
}
В следующей модификации переопределения не происходит и на рисунке видно три графика
Код:
cc <- c('green', 'red', 'blue')
N=100
gr <- ggplot()
Y <- matrix(nrow=3,ncol=N)
n = 1:N;
for (k in 1:3) {
Y[k, ] <- 1/k*sin(n)
gr <- gr + ( function(m, n, Y) geom_line(aes(x=n, y=Y[m, ]), color=cc[m]) )(k, n, Y)
}
В моей версии вместо анонимной функции можно и стандартную функцию использовать, но анонимная мне показалась немного более к месту.

 Профиль  
                  
 
 Posted automatically
Сообщение11.10.2022, 09:52 
Админ форума


02/02/19
2625
 i  Тема перемещена из форума «Программирование» в форум «Околонаучный софт»
Причина переноса: тематика.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group