2016-08-17 199 views
0

這是一個後續帖子Draw min, max function in R中的R一個情節

我想在一個情節不同的參數來繪製多個函數繪製多個功能不同的參數。但ggplot的羣體論點似乎不起作用。

數據:

# data preparation/ load 
feTargetPv <- structure(list(ModelYear = 2012:2016, 
ComplianceCategory = c("pv","pv", "pv", "pv", "pv"), 
fetargetfix = c(30.7, 31.4, 32.1, 33.3, 34.7), 
a = c("35.95", "36.8", "37.75", "39.24", "41.09"), 
b = c("27.95", "28.46", "29.03", "29.9", "30.96"), 
c = c("0.0005308", "0.0005308", "0.0005308", "0.0005308", "0.0005308"), 
d = c("0.006057", "0.00541", "0.004725", "0.003719", "0.002573")), 
.Names = c("ModelYear", "ComplianceCategory", "fetargetfix", "a", "b", "c", "d"), 
row.names = c(47L, 49L, 51L, 53L, 55L), class = "data.frame") 

功能:

my <- c(2012,2013, 2014) 
eqs = function(x,my){ 
    1/(pmin(pmax(as.numeric(feTargetPv[which(feTargetPv$ModelYear == my),"c"]) * x + 
       as.numeric(feTargetPv[which(feTargetPv$ModelYear == my),"d"]), 
       1/as.numeric(feTargetPv[which(feTargetPv$ModelYear == my),"a"])), 
      1/as.numeric(feTargetPv[which(feTargetPv$ModelYear == my),"b"]))) 
} 

Ggplot:

ggplot(data.frame(x=seq(from = 30, to = 75, by = 1)), aes(x), group = my, col = my) + 
    stat_function(fun=eqs, args=my) + xlab("x") + ylab("y") 

錯誤消息

Warning message: 
Computation failed in `stat_function()`: 
unused arguments (2013, 2014) 

如何將我的參數提供給stat_function()?

+0

看來,'stat_function'不喜歡每次通話繪製多個功能。最好的解決方案可能是在循環內向'stat_function'添加多個調用。參見:http://stackoverflow.com/questions/24949065/multiple-stat-function-on-grouped-data-with-ggplot2 – jdobres

回答

1

而不是使用stat_function,您可以通過ggplot以外的函數計算每年的值,然後使用geom_line

您可以從您的作爲您的ModelYear變量,開始爲每年製作x值的數據集。

dat = expand.grid(x=seq(from = 30, to = 75, by = 1), ModelYear = my) 

然後將您的x值與包含函數參數值的數據集合並。默認情況下,這隻保留第一個數據集dat的信息。

dat2 = merge(dat, feTargetPv, by = "ModelYear") 

現在您的函數可以採用x,a,b,c,d或者數據集和x變量的向量。

eqs = function(data, x){ 
    1/(pmin(pmax(as.numeric(data[,"c"]) * x + 
       as.numeric(data[,"d"]), 
       1/as.numeric(data[,"a"])), 
      1/as.numeric(data[,"b"]))) 
} 

將函數中的值作爲列添加到數據集中。我稱這個新變量爲y

dat2$y = eqs(dat2, dat2$x) 

現在繪圖是直截了當的,使用y值來映射與geom_line沿y位置。

ggplot(dat2, aes(x, y, color = factor(ModelYear))) + 
    geom_line() 

enter image description here