2014 dxdy logo

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

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




 
 Хелп! R: накопление графиков в цикле
Сообщение24.09.2022, 10:19 
Аватара пользователя
Что-то я базовое не понимаю про то, что такое данные в 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 
Сгенерируем сначала координаты
Код:
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])
И получим три графика на одном рисунке.
Вложение:
pic.png

Если же в цикле выполнять «добавление» линий
Код:
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 
Аватара пользователя
Понятно... наверное. А нельзя ли
GAA в сообщении #1565387 писал(а):
Затем выполним

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

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

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

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

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

 
 
 
 Re: Хелп! R: накопление графиков в цикле
Сообщение26.09.2022, 14:56 
Я упростил пример переопределения в предыдущем своём сообщении.

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

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

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 
 i  Тема перемещена из форума «Программирование» в форум «Околонаучный софт»
Причина переноса: тематика.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group