R:如何从data.frame中提取数据以绘制透视图?

时间:2014-04-01 04:33:46

标签: r plot

我是R的初学者。我想绘制数据框不同列之间的数字关系。

目前我有以下数据框:

    topN  Precision    Recall    F1Score udim idim tdim
10    50 0.02712121 0.2843955 0.04951998   67   78   50
40    50 0.02515152 0.2584113 0.04584124   67  156   50
70    50 0.02539924 0.2585877 0.04625516   67  234   50
100   50 0.02608365 0.2735997 0.04762680  133   78   50
130   50 0.02431818 0.2504262 0.04433146  133  156   50
160   50 0.02425856 0.2448997 0.04414439  133  234   50
190   50 0.02418251 0.2498824 0.04409746  200   78   50
220   50 0.02342205 0.2436125 0.04273533  200  156   50
250   50 0.02136882 0.2179636 0.03892181  200  234   50

我想绘制udim,idim和F1Score之间的3D关系。我在R中使用persp()函数。我想确保我在z上使用t()做正确的事。

所以

x是udim:67 133 200

y是idim:78 156 234

z是数据框中相应的F1Score值。

我使用以下代码:

plot.data <- read.table(plot.file, sep=",", header=T) 
# plot.file is the data frame file location

udim <- as.factor(plot.data$udim)
u <-as.integer(levels(udim))

idim <- as.factor(plot.data$idim)
i <- as.integer(levels(idim))

t <- as.integer(levels(as.factor(plot.data$tdim)))

z <- outer(u, i, FUN = function(u, i){
  ss <- subset(plot.data, tdim == 50 & topN == 50) #udim == u & idim == i &
  ss$F1Score
})

persp(u, i, t(z), theta=45, phi=45, shade = 0.45, xlab="user dim", 
      ylab="item dim", zlab="F1 Score", scale=TRUE)

我得到了以下情节:

3D perspective plot: udim, idim, F1Score

我正在密谋吗? 这是解决此类任务的最简单/最正常的方法吗?

实际上在我的数据框中我有更多的行具有不同的topNs和tdim值,因此可以添加一个或两个维度,比如tdim,topN,以反映绘图中这么多列之间的数字关系吗

1 个答案:

答案 0 :(得分:1)

你的图表看起来很漂亮,我无法回答你的第二个问题。

但是,我想为您提供另一种三向图选项。 虽然它们通常很混乱,但我发现了一种吸引人的方式来使用3D Scatterplots。 使用scatterplot3danimation以及某些第三方软件(如ImageMagick (http://imagemagick.org)),您可以创建3D散点图的动画图片,这些图片无疑是使用计算机进行数据呈现的选项。

您的数据示例(我现在没有安装animation软件包,因此我只能为您提供该图的语法):

 library(scatterplot3d)

 F1Score <- c(0.04951998,0.04584124,0.04625516,0.04762680,0.04433146,0.04414439,0.04409746,0.04273533,0.03892181)
 udim <- c(67,67,67,133,133,133,200,200,200)
 idim <- c(78,156,234,78,156,234,78,156,234)

 for (j in seq(5, 175, by = 5)) {
 scatterplot3d(udim, idim, F1Score, angle = j)
 Sys.sleep(0.042) # for 24 fps when looking at it in R
 }