7

以下示例类似于我的数据集:

require(randomForest)

alpha = c(1,2,3,4,5,6)
bravo = c(2,3,4,5,6,7)
charlie = c(2,6,5,3,5,6)
mydata = data.frame(alpha,bravo,charlie)

myrf = randomForest(alpha~bravo+charlie, data = mydata, importance = TRUE)

varImpPlot(myrf, type = 2)

我似乎无法控制 y 轴标签在varImpPlot. 我曾尝试更改绘图参数(例如 mar、oma),但没有成功。我需要将 y 轴标签向左移动,以便生成具有正确标签位置的 PDF。

如何将 y 轴标签向左移动?

4

3 回答 3

7

我尝试使用adj参数,但它产生了一个错误。作为 varImpPlot ,dotchart在后面使用,这里是使用 lattice 的版本dotplot。然后,您可以使用scales参数自定义轴。

imp <- importance(myref, class = NULL, scale = TRUE, type = 2)
dotplot(imp, scales=list(y =list(cex=2,
                                       at = c(1,2),
                                       col='red',
                                       rot =20,
                                       axs='i') ,
                               x =list(cex=2,col='blue')) )

在此处输入图像描述

于 2013-02-15T18:46:16.990 回答
4

您可以从 myref 中提取构建绘图所需的数据,并使用 ggplot 构建绘图。通过这样做,您可以更自由地调整情节。这里有些例子

library(ggplot2)

str(myrf)
str(myrf$importance)
data <- as.data.frame(cbind(rownames(myrf$importance),round(myrf$importance[,"IncNodePurity"],1)))
colnames(data) <- c("Parameters","IncNodePurity")
data$IncNodePurity <- as.numeric(as.character(data$IncNodePurity))

标准情节:

(p <- ggplot(data) + geom_point(aes(IncNodePurity,Parameters))) 

旋转 y 轴标签:

(p1 <- p+ theme(axis.text.y = element_text(angle = 90, hjust = 1)))

更多调整(也是此处显示的第一个图):

(p2 <- p1 +  scale_x_continuous(limits=c(3,7),breaks=3:7) + theme(axis.title.y = element_blank())) 

看起来像 varImpPlot 的图(此处显示的第二个图):

(p3 <- p2+ theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_line(colour = 'gray', linetype = 'dashed'),
panel.background = element_rect(fill='white', colour='black')))

使用 ggplot 可以轻松保存为 pdf:

ggsave("randomforestplot.pdf",p2) 

或者

ggsave("randomforestplot.png",p2)

p2

在此处输入图像描述

p3

在此处输入图像描述

于 2013-03-09T22:01:44.553 回答
1

我是否理解正确,您想在情节边界的左侧获取文本charlie和更多内容?bravo如果是这样,这里有一个 hack 来存档这个,基于rownames绘图中使用的修改:

myrf = randomForest(alpha~bravo+charlie, data = mydata, importance = TRUE)
#add white spaces at the end of the rownames
rownames(myrf$importance)<-paste(rownames(myrf$importance), "   ") 
varImpPlot(myrf, type = 2)

in 中的 adj 参数dotchart固定为 0(右对齐),所以不修改 的代码就无法更改dotchart

mtext(labs, side = 2, line = loffset, at = y, **adj = 0**, col = color, 
    las = 2, cex = cex, ...)

(来自dotchart

编辑:您也可以进行另一种黑客攻击。取 的代码dotchart,将上面的行改为

 mtext(labs, side = 2, line = loffset, at = y, adj = adjust_ylab, col = color, 
        las = 2, cex = cex, ...)

然后将参数添加adjust_ylab到参数列表中,并将函数重命名为 example dotchartHack。现在复制 的代码varImpPlot,找到调用的行dotchart,将函数名称更改为dotchartHack并将参数添加adjust_ylab=adjust_ylab到函数调用中,将函数重命名为varImpPlotHack并添加adjust_ylab到此函数的参数列表中。现在您可以通过更改参数来更改charlieand的对齐方式:bravoadjust_ylab

 myrf = randomForest(alpha~bravo+charlie, data = mydata, importance = TRUE) 
 varImpPlotHack(myrf, type = 2,adjust_ylab=0.5)

来自?par

adj 的值决定了文本字符串在 text、mtext 和 title 中的对齐方式。值 0 生成左对齐文本、0.5(默认)居中文本和右对齐文本。([0, 1] 中的任何值都是允许的,并且在大多数设备上,该间隔之外的值也可以使用。)

于 2013-03-07T06:59:57.147 回答