Как наложить 3 функции на один график, используя R - PullRequest
2 голосов
/ 06 октября 2019

У меня есть три функции и код графика:

f1 <- function(c){0.187*c-0.000236*c^2+0.194*10-0.00330*100-0.000406*10}
f2 <- function(c){0.187*c-0.000236*c^2+0.194*16.53-0.00330*(16.53^2)-0.000406*16.53}
f3 <- function(c){0.187*c-0.000236*c^2+0.194*20-0.00330*400-0.000406*20}

Я хочу построить все три из них на одном графике. В настоящее время у меня есть:

png("figure.png")
plot(f1(1:1000), type="l", xlab="x", ylab="y", main="the plot :)")
plot(f2(1:1000), type="l", xlab="x", ylab="y", add = T)
dev.off()

Пока что на графике получается просто f1 , а не f1 и f2 . Я полагаю, что использую неправильный подход, потому что я создаю другой сюжет и пытаюсь добавить его к уже существующему сюжету. Я не уверен, использовать ли geom_line или что-то подобное и просто наложить его.

Есть ли прямой способ построить несколько функций и наложить их на один график?

Ответы [ 4 ]

2 голосов
/ 06 октября 2019

ИЛИ придерживаясь графика R, как ваш код, вы можете просто добавить дополнительные функции, используя lines

plot(f1(1:1000), type="l", xlab="x", ylab="y", main="the plot :)")
lines(1:1000, f2(1:1000))
lines(1:1000, f3(1:1000))
2 голосов
/ 06 октября 2019

Если вы хотите, чтобы два графика располагались один рядом с другим, вы должны установить параметр вашей палитры. Используйте par (mfrow = c (1,2)) после команды png ().

png("figure.png")
par(mfrow=c(1,2))
plot(f1(1:1000), type="l", xlab="x", ylab="y", main="the plot :)")
plot(f2(1:1000), type="l", xlab="x", ylab="y", add = T)
dev.off()
2 голосов
/ 06 октября 2019

geom_line для ggplot2, который представляет собой совершенно другую систему печати.

Если вы начнете с plot(), вы можете использовать lines() для рисования линий на вашем текущем графике. Ваши линии довольно близко друг к другу, поэтому здесь это не имеет большого значения, но с базой plot вы обычно хотите заранее рассчитать максимальный диапазон, чтобы вы могли настроить окно графика с самого начала:

x = 1:1000
y1 = f1(x)
y2 = f2(x)
y3 = f3(x)

y_range = range(c(y1, y2, y3))

plot(x, y1, ylim = y_range, type="l", xlab="x", ylab="y", main="the plot :)", col = "red")
lines(x, y2, col = "blue")
lines(x, y3, col = "chartreuse")

enter image description here

ggplot2 предназначен для работы с данными во фреймах данных - особенно с фреймами данных длинного формата. Вот как мы можем подойти к проблеме с ggplot. (Обратите внимание, что, в отличие от вышеизложенного, ggplot вычисляет пределы сюжета и автоматически создает красивую легенду.)

library(ggplot2)
dd = data.frame(x, y1, y2, y3)
d_long = reshape2::melt(data = dd, id.vars = "x", variable.name = "fun", value.name = "y")
ggplot(d_long, aes(x = x, y = y, color = fun)) +
  geom_line()

enter image description here

1 голос
/ 07 октября 2019

Для функций вы также можете использовать curve:

f1 <- function(c){0.187*c-0.000236*c^2+0.194*10-0.00330*100-0.000406*10}
f2 <- function(c){0.187*c-0.000236*c^2+0.194*16.53-0.00330*(16.53^2)-0.000406*16.53}
f3 <- function(c){0.187*c-0.000236*c^2+0.194*20-0.00330*400-0.000406*20}

c0 <- 1
c <- 1000
curve(f1, c0, c, main = 'the plot :)', xlab = 'x', ylab = 'y')
curve(f2, c0, c, add = T)
curve(f3, c0, c, add = T)

r programming curve

Как отметил @Gregor, geom_line() - это ggplot()вызов. Чтобы перейти на tidyverse, вы можете сделать:

#or with ggplot / geom_line
library(tidyverse)

map_df(list(f1 =f1,f2 =  f2,f3 = f3), exec, 1:1000)%>%
  mutate(x = 1:1000)%>%
  gather(key = fx,value = value, -x)%>%
  ggplot(aes(x = x, y = value, col = fx)) + geom_line() 

ggplot and purrr multiple functions

Наконец, вас может заинтересовать также facet_grid:

map_df(list(f1 =f1,f2 =  f2,f3 = f3), exec, 1:1000)%>%
  mutate(x = 1:1000)%>%
  gather(key = fx,value = value, -x)%>%
  ggplot(aes(x = x, y = value)) + geom_line() +
  facet_grid(rows = vars(fx))

ggplot facet_grid

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