在R中绘制简单数据

22

我有一个以逗号分隔的文件,名为 foo.csv,包含以下数据:

scale, serial, spawn, for, worker
5, 0.000178, 0.000288, 0.000292, 0.000300
10, 0.156986, 0.297926, 0.064509, 0.066297
12, 2.658998, 6.059502, 0.912733, 0.923606
15, 188.023411, 719.463264, 164.111459, 161.687982

我的问题有两个:

1)我该如何绘制第一列(x轴)与第二列(y轴)之间的关系图?我正在尝试以下方法(从此网站上阅读):

data <- read.table("foo.csv", header=T,sep=",")
attach(data)
scale <- data[1]
serial <- data[2]
plot(scale,serial)

但我收到了这个错误信息:

Error in stripchart.default(x1, ...) : invalid plotting method

有没有想法我做错了什么?一个快速谷歌搜索显示有人遇到同样的问题但没有相关答案。更新:如果我跳过中间的两个赋值语句,它可以正常工作。你有什么想法为什么会这样?
第二个问题紧随其后:
2)如何将第一列(x轴)与所有其他列在y轴上绘制出来?我认为一旦我解决了我遇到的第一个问题,这就很容易了,但我对R还是有点陌生,所以我还在逐渐理解中。
7个回答

15

你不需要这两行代码:

scale <- data[1]
serial <- data[2]

由于headers在read.table中已经设置了scale和serial,因此它们已经被设定。

此外,scale <- data[1]data.frame中创建一个元素。

  data[1]
1     5
2    10
3    12
4    15

read.table中的scale是一个向量

5 10 12 15

plot(scale, serial)函数期望传入一个向量而不是数据框,因此你只需要执行

plot(scale, serial)

在y轴上绘制其他数据列的一种方法:

plot(scale,serial, ylab="")
par(new=TRUE) 
plot(scale,spawn,axes=F, ylab="", type="b")
par(new=TRUE) 
plot(scale,for., axes=F, ylab="", type="b")
par(new=TRUE) 
plot(scale,worker,axes=F, ylab="", type="b")

可能有更好的方法来做这件事,但那超出了我目前 R 知识的范围...


那么他的plot()调用应该长什么样? - anon
不幸的是,“scale”似乎是某种全局变量。 - anon
1
我认为应该没问题(在我的R上面所有的都正常工作:))。scale变量将从read.table中设置,并且不应干扰“全局”的scale()函数。 - luapyad

7
在您的例子中,
plot(scale, serial) 

无法工作,因为scaleserial都是数据框架,例如。

class(scale)
[1] "data.frame"

您可以尝试以下方法,在生成绘图后使用points()绘制剩余列。请注意,我在plot中使用了ylim参数来适应第三列的范围。

data <- read.csv('foo.csv', header=T)
plot(data$scale, data$serial, ylim=c(0,750))
points(data$scale, data$spawn, col='red')
points(data$scale, data$for., col='green')
points(data$scale, data$worker, col='blue')

5

我在R中还是新手,但如果您想要在一个图中绘制比例与其他所有列,而且希望打印或演示时具有一定的优雅性:),您可以使用Hadley Wickham教授的ggplot2和reshape包。

安装:

install.packages(“ggplot2”,dep=T)
install.packages(“reshape”,dep=T)

绘制您的示例:
library(ggplot2)
library(reshape)

#read data
data = read.table("foo.csv", header=T,sep=",")

#melt data “scale vs. all”
data2=melt(data,id=c("scale"))
data2

   scale variable      value
1      5   serial   0.000178
2     10   serial   0.156986
3     12   serial   2.658998
4     15   serial 188.023411
5      5    spawn   0.000288
6     10    spawn   0.297926
7     12    spawn   6.059502
8     15    spawn 719.463264
9      5     for.   0.000292
10    10     for.   0.064509
11    12     for.   0.912733
12    15     for. 164.111459
13     5   worker   0.000300
14    10   worker   0.066297
15    12   worker   0.923606
16    15   worker 161.687982

#draw all variables at once as line with different linetypes
qplot(scale,value,data=data2,geom="line",linetype=variable)

您还可以使用点(geom=”points”),选择不同的颜色或形状来表示不同的变量点(colours=variable or shape=variable),调整坐标轴,为每条线设置单独的选项等等。

链接到在线文档


2

虽然我不是R的专家,但我认为你需要一个数据框:

plot(data.frame(data[1],data[2]))

它至少在我的R设置中绘制了一些东西!

根据luapyad的建议,我得出了以下结论。我将标题重命名为“比例尺”:

scaling, serial, spawn, for, worker
5, 0.000178, 0.000288, 0.000292, 0.000300
10, 0.156986, 0.297926, 0.064509, 0.066297
12, 2.658998, 6.059502, 0.912733, 0.923606
15, 188.023411, 719.463264, 164.111459, 161.687982

然后:

foo <- read.table("foo.csv", header=T,sep=",")
attach(foo)
plot( scaling, serial );

2

试试这个:

data <- read.csv('foo.csv')
plot(serial ~ scale, data)
dev.new()
plot(spawn ~ scale, data)
dev.new()
plot(for. ~ scale, data)
dev.new()
plot(worker ~ scale, data)

2
你可以使用matplot(data[1],data[2,5],type="b")或在个别绘图命令之前加上layout(matrix(c(1,2,3,4),2,2,byrow=TRUE)),将这4个图形合并成一个图形。 - bubaker

0
data <- read.table(...)
plot(data$scale,data$serial)

0

有一种简单的绘图方法:

https://code.google.com/p/simple-r/

使用该脚本,您只需输入:

r -cdps, -k1:2 foo.csv

要获得您想要的图形,请将其放入详细模式(-v)以查看相应的R脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接