【问题标题】:Plotting Simple Data in R在 R 中绘制简单数据
【发布时间】:2010-10-26 23:27:14
【问题描述】:

我有一个名为 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 轴)?我正在尝试这个(来自阅读this site):

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

知道我做错了什么吗? quick Google search 揭示了其他人有同样问题但没有相关答案。更新:事实证明,如果我跳过中间的两个赋值语句,它工作得很好。知道这是为什么吗?

第二个问题紧随第一个问题之后:

2) 如何绘制第一列(x 轴)与 y 轴上的所有其他列?我想一旦我解决了我遇到的第一个问题,这很容易,但我对 R 有点陌生,所以我仍然在思考它。

【问题讨论】:

    标签: r plot


    【解决方案1】:
    data <- read.table(...)
    plot(data$scale,data$serial)
    

    【讨论】:

      【解决方案2】:

      有一种简单的绘制方式:

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

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

      r -cdps, -k1:2 foo.csv
      

      得到你想要的情节。将其置于详细模式 (-v) 以查看相应的 R 脚本。

      【讨论】:

        【解决方案3】:

        在你的例子中,

        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')
        

        【讨论】:

          【解决方案4】:

          我是 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)、调整轴、为每条线设置单独的选项等。

          链接到online documentation

          【讨论】:

            【解决方案5】:

            试试这个:

            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)
            

            【讨论】:

            • 您可以使用 matplot(data[1],data[2,5],type="b") 或使用 layout(矩阵(c(1,2,3,4),2,2,byrow=TRUE))
            【解决方案6】:

            我远非 R 专家,但我认为您需要一个 data.frame:

            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 );
            

            【讨论】:

              【解决方案7】:

              你不需要这两行:

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

              因为 scale 和 serial 已经从 read.table 的标题中设置。

              同样scale &lt;- data[1]data.frame创建一个元素

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

              而来自read.tablescale 是一个向量

              5 10 12 15
              

              plot(scale, serial) 函数需要向量而不是data.frame,所以你只需要这样做

              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() 调用应该是什么样子?
              • 不幸的是,“规模”似乎是某种全球性的。
              • 我认为应该没问题(无论如何,以上所有内容在我的 R 上都可以正常工作:))。 scale 变量将从 read.table 中设置,并且不应干扰“全局”scale() 函数。
              • 是的,做到了。感谢您的帮助!
              猜你喜欢
              • 2018-03-09
              • 2021-08-14
              • 2021-12-07
              • 1970-01-01
              • 1970-01-01
              • 2017-06-25
              • 2020-06-27
              • 2017-09-25
              • 1970-01-01
              相关资源
              最近更新 更多