Вопрос
У меня есть файл, разделенный запятыми, с именем 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
Есть идеи, что я делаю не так?A быстрый поиск в Google выявляет кого-то другого с такой же проблемой, но без соответствующего ответа.Обновить:Оказывается, это работает нормально, если я пропускаю два оператора присваивания посередине.Есть какие-нибудь идеи, почему это так?
Второй вопрос довольно легко следует за первым:
2) Как мне отобразить первый столбец (ось x) по сравнению со всеми остальными столбцами по оси y?Я предполагаю, что это довольно просто, как только я разберусь с первой проблемой, с которой столкнусь, но я просто немного новичок в R, поэтому я все еще обдумываю это.
Решение
Вам не нужны эти две строки:
scale <- data[1]
serial <- data[2]
поскольку масштаб и серийный номер уже заданы из заголовков в read.table
.
Также scale <- data[1]
создает элемент из data.frame
data[1]
1 5
2 10
3 12
4 15
принимая во внимание scale
из read.table
является вектором
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(scale, serial)
не сработает, потому что scale
и serial
являются обоими фреймами данных, например
class(scale)
[1] "data.frame"
Вы могли бы попробовать следующее и использовать points()
, как только график будет сгенерирован, нанести на график остальные столбцы.Обратите внимание, я использовал ylim
параметр в plot
для размещения ассортимента в третьей колонке.
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')
Я новичок в R, но если вы хотите нарисовать масштаб по сравнениювсе остальные столбцы на одном графике, легко и с некоторой элегантностью :) для печати или презентации вы можете использовать Prof.Пакеты Хэдли Уикхема 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
), отрегулируйте ось, установите индивидуальные параметры для каждой линии и т.д.
Ссылка на онлайновая документация.
Я далек от того, чтобы быть экспертом по R, но я думаю, что вам нужен data.frame:
plot(data.frame(data[1],data[2]))
Это, по крайней мере, что-то отображает в моей настройке R!
Следуя совету, содержащемуся в ответе луапьяда, я пришел к этому.Я переименовал заголовок в "масштаб".:
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 );
Попробуй это:
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)
Существует простой способ построения графика-r:
https://code.google.com/p/simple-r/
Используя этот скрипт, вам просто нужно ввести:
r -cdps, -k1:2 foo.csv
Чтобы получить нужный вам сюжет.Переведите его в подробный режим (-v), чтобы увидеть соответствующий R-скрипт.
data <- read.table(...)
plot(data$scale,data$serial)