Как наложить несколько кривых плотности на один график в R

У меня есть данные, похожие на эти.

И я намерен создать несколько кривых плотности на одном графике, где каждая кривая соответствует уникальному идентификатору.

Я пытался использовать пакет "sm" с этим кодом, но безуспешно.

library(sm)
dat <- read.table("mydat.txt");
plotfn <- ("~/Desktop/flowgram_superimposed.pdf");
pdf(plotfn);

sm.density.compare(dat$V1,dat$V2, xlab = "Flow Signal")
colfill <- c(2:10);
legend(locator(1), levels(dat$V2), fill=colfill)

dev.off();

Посоветуйте, как правильно поступить или есть альтернативный способ?

Я пытаюсь получить такой сюжет в конце. рисунок http://img524.imageshack.us/img524/2736/testl.png


person neversaint    schedule 02.09.2009    source источник
comment
Задавать вопросы здесь и в R-списке одновременно: не круто. nabble.com/   -  person Eduardo Leoni    schedule 02.09.2009
comment
Я не уверен, что понимаю, почему, учитывая, что между двумя группами пользователей пока нет большого совпадения. Можно поподробнее, почему этого делать нельзя?   -  person Matt Parker    schedule 02.09.2009
comment
Мультипостинг — это пустая трата полосы пропускания, денег и времени людей, без каких-либо преимуществ, и этим никогда не следует заниматься. .ly/Ja5n1 . Хотя первые две причины менее важны в наши дни, я ценю свое время и не люблю читать одно и то же сообщение в нескольких списках.   -  person Eduardo Leoni    schedule 03.09.2009
comment
OT(one)H, я согласен, что несколько постов в разных местах могут быть пустой тратой времени. OT(other)H, это шанс показать, что SO является лучшим форумом по сравнению с сервером рассылки для ответа на этот вопрос.   -  person medriscoll    schedule 03.09.2009
comment
Что ж, беру обратно. Поскольку мы все хотим увеличить популярность SO (и R!), чем больше, тем лучше.   -  person Eduardo Leoni    schedule 03.09.2009


Ответы (4)


Попробуйте использовать ggplot2:

dnow <- read.table("http://dpaste.com/88561/plain/")
library(ggplot2)
qplot(V1, colour=factor(V2), data=dnow, geom="density")
person Eduardo Leoni    schedule 02.09.2009
comment
ссылка уже не рабочая. Таким образом, я не могу понять, что делает ваше решение. Не могли бы вы исправить ссылку? Спасибо... - person Manoel Galdino; 22.04.2011
comment
@Manoel qplot(mtcars$drat, colour=factor(mtcars$cyl), data=mtcars, geom="density") должен дать вам функциональный пример. - person unode; 17.11.2011

Вы также можете решить эту проблему с помощью пакета решетки.

require(lattice)
dnow <- read.table('http://dpaste.com/88561/plain/')
densityplot(~V1, groups=V2, data=dnow)
person Abhijit    schedule 03.09.2009

Использование базовой графики в стиле спагетти-кода:

plot.multi.dens <- function(s)
{
junk.x = NULL
junk.y = NULL
for(i in 1:length(s))
{
junk.x = c(junk.x, density(s[[i]])$x)
junk.y = c(junk.y, density(s[[i]])$y)
}
xr <- range(junk.x)
yr <- range(junk.y)
plot(density(s[[1]]), xlim = xr, ylim = yr, main = "")
for(i in 1:length(s))
{
lines(density(s[[i]]), xlim = xr, ylim = yr, col = i)
}
}
dnow <- read.table("http://dpaste.com/88561/plain/")
library(sqldf)
x <- unlist(sqldf("select V1 from dnow where V2==0"))
y <- unlist(sqldf("select V1 from dnow where V2==1"))
z <- unlist(sqldf("select V1 from dnow where V2==2"))
plot.multi.dens(list(x,y,z))
library(Hmisc)
le <- largest.empty(x,y,.1,.1)
legend(le,legend=c("x","y","z"), col=(1:3), lwd=2, lty = 1)
person Paolo    schedule 02.09.2009
comment
Какова цель использования sqldf здесь? Это буквально в сто раз медленнее, чем индексация: x ‹- with(dnow,V1[V2==0]) - person Eduardo Leoni; 02.09.2009
comment
Ты прав. Но мне нравится пакет и подход sqldf, поэтому я склонен использовать его бездумно ;-) - person Paolo; 02.09.2009

Я обнаружил, что мне часто приходится делать это при просмотре данных микрочипов, поэтому я включил это как часть библиотеки служебного кода, которую я храню на github: ARE.utils, особенно plot.densities.

Он использует базовую графику, поэтому вы можете черпать вдохновение из этой функции, чтобы создать свою собственную, или просто продавать ее оптом (но она зависит от некоторых других функций в этой библиотеке):

  1. create.densities, который преобразует список/матрицу /etc данных в список плотностей; а также
  2. Функция match.dim (которая преобразует имена измерений "в числовые оси).

(При желании вы можете установить весь пакет, но я не обещаю, что функции в нем не изменятся каким-то образом, несовместимым с предыдущими версиями).

Нетрудно написать свою собственную такую ​​функцию, но просто убедитесь, что функция выбирает правильный диапазон по осям и прочее. В любом случае, вы должны использовать такой код:

library(ARE.utils)
# Create a matrix dataset with separate observations in columns
dat <- matrix(c(rnorm(100), rnorm(100, mean=3), 
                rnorm(100, mean=3, sd=2)),
              ncol=3)
# Plot them
plot.densities(dat, along='cols')

Это создаст три графика различной плотности на одной оси с их собственными цветами.

person Steve Lianoglou    schedule 02.09.2009
comment
Стив, если это полезно и проходит проверку R CMD, обязательно отправьте его в CRAN. Если он еще не прошел проверку R CMD, поработайте над этой частью, а затем вернитесь к предыдущему шагу :) - person Dirk Eddelbuettel; 02.09.2009
comment
Дирк, ты намекаешь на то, что обратная совместимость не должна вызывать особого беспокойства? - person Eduardo Leoni; 02.09.2009
comment
Эдуардо: При чем тут обратная совместимость? Не стесняйтесь писать мне по электронной почте за пределами SO. Я действительно не понимаю вашего вопроса. - person Dirk Eddelbuettel; 02.09.2009
comment
Дирк: Думаю, он обратил внимание на мое упоминание о возможности обратно несовместимых изменений в ARE.utils. Я почему-то (неправильно?) ожидаю, как и Эдуардо, что пакет на CRAN будет немного лучше поддерживаться/разрабатываться, чем то, что у меня есть здесь. Хотя я стараюсь хорошо спроектировать/реализовать этот материал, нередко обнаруживаю, что я заново реализовал что-то, что можно было бы сделать лучше с помощью нескольких команд в base::R, а затем удалил это из библиотеки. Возможно, когда-нибудь я отправлю заявку в CRAN, если почувствую, что это не так, но до тех пор я рад позволить другим людям использовать его для вдохновения :-) - person Steve Lianoglou; 03.09.2009