【问题标题】:How to plot multiple leveled plots in R如何在 R 中绘制多个水平图
【发布时间】:2018-03-10 11:33:40
【问题描述】:

我正在通过AppliedPredictiveModeling 工作,遇到了一个没有描述其功能的情节。生成数据的代码是:

svmParam2 <- expand.grid(eps = c(.01, 0.05, .1, .5 ), costs= 2^c(-2, 0, 2, 8),
                     sigma = as.vector(sigest(y~x, data=sinData, frac=.75)))

for (i in 1:nrow(svmParam2)){
   rbfSVM<-ksvm(x=x, y=y, data=sinData,
           kernel="rbfdot",
           kpar=list(sigma=svmParam2$sigma[i]),
           C=svmParam2$costs[i],
           epsilon=svmParam2$eps[i])

   tmp <- data.frame(x=dataGrid$x,
                y=predict(rbfSVM, newdata=dataGrid),
                eps=paste("epsilon:", format(svmParam2$eps)[i]),
                costs=paste("cost:", (svmParam2$costs)[i]),
                sigma=paste("sigma:", format(svmParam2$sigma, digits=2)[i]))
  svmPred2 <- if(i==1) tmp else rbind(tmp, svmPred2)
}
svmPred2$costs <- factor(svmPred2$costs, levels = rev(levels(svmPred2$costs)))
svmPred2$sigma <- factor(svmPred2$sigma, levels = rev(levels(svmPred2$sigma)))

情节看起来像这样:What I want to replicate

每个图是一个常规的 x、y 图,有四个不同的曲线,每个 sigma 值一个,总共有 16 个不同的图,每列具有不同的成本值,每行具有不同的 epsilon 值。

【问题讨论】:

  • 没有什么facet_wrap 无法处理的。
  • 从您的示例图的外观来看,他们使用的是格子图。尝试创建一个图(对于一个成本值),然后使用公式使用 lattice 在所有成本中复制该图。或者你可以走一条 ggplot 路线并使用 facet_wrap。
  • x 轴上有什么?
  • 对不起,如果不清楚,x 轴是一个向量,有 2 到 10 之间的 100 个值。我相信这些图确实是使用 lattice 制作的,你有任何关于如何完成的示例代码使用我的格式的数据框?我一直在尝试,但没有成功。
  • @Marcus Grass 问题很清楚,但是我不明白 x 轴映射什么 - 100 个值到底代表什么?如果你能解释一下,我很乐意发布 lattice 和 ggplot 的代码。 y轴是精度,颜色和刻面也很明显,但是x轴是什么?

标签: r plot


【解决方案1】:

一种方法是使用 ggplot:

library(ggplot2)

ggplot(svmPred2)+
   geom_line(aes(x = x, y = y, color = sigma))+
   facet_grid(eps ~ costs) +
   theme_bw()

并带有格子:

library(lattice)
library(latticeExtra)

useOuterStrips(strip=strip.custom(bg = "skyblue"), 
               strip.left=strip.custom(bg = "skyblue"), 
               xyplot(y~x |costs *eps,
                      data = svmPred2,
                      type = 'l',
                      groups = sigma,
                      col = c("red","blue","green"),
                      auto.key = list(columns = 3)))

数据:

library(kernlab)

x <- runif(100, min=2, max=10)
y <- sin(x)+rnorm(length(x))*.25
sinData <- data.frame(x=x, y=y)
dataGrid <- data.frame(x = seq(2, 10, length = 100))

svmParam2 <- expand.grid(eps = c(.01, 0.05, .1, .5 ), costs= 2^c(-2, 0, 2, 8),
                         sigma = as.vector(sigest(y~x, data=sinData, frac=.75)))

svmPred2 <- data.frame()
for (i in 1:nrow(svmParam2)){
  rbfSVM<-ksvm(x=x, y=y, data=sinData,
               kernel="rbfdot",
               kpar=list(sigma=svmParam2$sigma[i]),
               C=svmParam2$costs[i],
               epsilon=svmParam2$eps[i])

  tmp <- data.frame(x=dataGrid$x,
                    y=predict(rbfSVM, newdata=dataGrid),
                    eps=paste("epsilon:", format(svmParam2$eps)[i]),
                    costs=paste("cost:", (svmParam2$costs)[i]),
                    sigma=paste("sigma:", format(svmParam2$sigma, digits=2)[i]))
  svmPred2 <- if(i==1) tmp else rbind(tmp, svmPred2)
}
svmPred2$costs <- factor(svmPred2$costs, levels = rev(levels(svmPred2$costs)))
svmPred2$sigma <- factor(svmPred2$sigma, levels = rev(levels(svmPred2$sigma)))

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2013-02-18
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多