【问题标题】:R: how to make multiple plots from one CSV, grouping by a columnR:如何从一个CSV制作多个图,按列分组
【发布时间】:2014-07-22 17:29:34
【问题描述】:

我想根据我在 CSV 中的数据(看起来像这样)将多个图放在 R 中的单个可视输出上:

user,size,time
fred,123,0.915022
fred,321,0.938769
fred,1285,1.185608
wilma,5146,2.196687
fred,7506,1.181990
barney,5146,1.860287
wilma,1172,1.158015
barney,5146,1.219313
wilma,13185,1.455904
wilma,8754,1.381372
wilma,878,1.216908
barney,2974,1.223852

我可以很好地阅读这个,例如:

data = read.csv('data.csv')

目前,一个相当简单的情节很好,所以我只是尝试plot(),没有太多内容(设置type='o' 以获取线和点),并且'从解决过去的问题,我知道我可以执行以下操作来获取刚刚 fred 的数据:

plot(data$time[which(data$user == 'fred')], data$size[which(data$user == 'fred')], type='o')

不过,我想要的是让每个用户的数据都显示在一组轴上,并使用颜色编码(以及将用户与颜色匹配的图例)来识别不同的用户数据。

如果另一个用户出现,我希望显示另一行,使用另一种颜色(如果我同时有太多用户,也许可以回收)。

但是,这并没有做到这一点:

plot(data$size, data$time, type='o',col=c("red", "blue", "green"))

因为它似乎没有按用户分组。

只有这个:

plot(data, type='o')

给我一​​个错误:

Error in plot.default(...) : 
  formal argument "type" matched by multiple actual arguments

这个:

plot(data)

确实做了一些事情,但不是我想要的。

我已经四处寻找,但我对 R 还不够陌生,所以我不太确定如何最好地搜索它,也不知道在哪里寻找会遇到这样的用例的示例。

我什至更接近了:

plot(data$size[which(data$user == 'wilma')], data$time[which(data$user == 'wilma')], type='o', col=c('red'))
lines(data$size[which(data$user == 'fred')], data$time[which(data$user == 'fred')], type='o', col=c('green'))
lines(data$size[which(data$user == 'barney')], data$time[which(data$user == 'barney')], type='o', col=c('blue'))

这给了我一个情节(我会在线发布,但作为一个新用户,我还不能这样做):

not-quite-right plot

这有点接近我想要的,除了它:

  • 没有图例
  • 有丑陋的轴标签,而不仅仅是时间和大小
  • 缩放到第一个图,因此缺少其他一些图的数据
  • 不按 x 轴排序,我可以在外部执行此操作,但我猜我可以在 R 中相当轻松地执行此操作。

所以,最终的问题是:

有什么简单的方法来绘制这样的数据:

  • 根据 CSV 第一列中的标签包含多行
  • 对第 2 列和第 3 列中的数据使用相同的轴集,而不考虑标签
  • 具有标签用于特定线(或点集)的图例和颜色编码
  • 将适应向数据文件添加新标签,希望不会更改 R 代码。

在此先感谢您提供任何帮助或指点。

附:我四处寻找类似的问题,发现one that's sort of close,但它并不完全相同,我无法弄清楚如何使其适应我正在尝试做的事情。

【问题讨论】:

    标签: r plot


    【解决方案1】:

    好问题。这在基础图中是可行的,但使用 ggplot2 更容易、更直观。下面是如何使用 ggplot2 中的随机数据进行此操作的示例

    首先下载安装包

    install.packages("ggplot2",repos='http://cran.us.r-project.org')
    require(ggplot2)
    

    接下来生成数据

    a <- c(rep('a',3),rep('b',3),rep('c',3))
    b <- rnorm(9,50,30)
    c <- rep(seq(1,3),3)
    dat <- data.frame(a,b,c)
    

    最后,制作剧情

    ggplot(data=dat, aes(x=c, y=b , group=a, colour=a)) + geom_line() + geom_point()
    

    基本上,您是在告诉 ggplot 您的 x 轴对应于 c 列 (dat$c),您的 y 轴对应于 b 列 (y$b) 并按 a 列分组(绘制单独的线)(数据$a)。 Color 指定您也想按 a 列对颜色进行分组。

    生成的图表如下所示:

    【讨论】:

    • 或者,使用 OP 的数据集:ggplot(data,aes(x=size,y=time, color=user))+geom_point()+geom_line()
    • 谢谢! @jlhoward 的评论加上 ggplot2 的安装/需要信息给了我我需要的东西!非常感激!如果/当我可以的时候,我会投票(尽管不知何故我的“好问题”被否决了?任何反对者都想说出我的问题有什么不好的地方,所以我以后可以问得更好?)
    猜你喜欢
    • 2018-08-21
    • 2020-09-16
    • 1970-01-01
    • 2022-01-10
    • 2014-02-08
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多