2012-04-26 3 views
0

я следующие данные и сюжет:Разброс участок с указанием цвета и маркировки оси в г

pos <- rep(1:2000, 20) 
xv =c(rep(1:20, each = 2000)) 
# colrs <- unique(xv) 
colrs <- xv # edits 
yv =rnorm(2000*20, 0.5, 0.1) 

xv = lapply(unique(xv), function(x) pos[xv==x]) 
to.add = cumsum(sapply(xv, max) + 1000) 

bp <- c(xv[[1]], unlist(lapply(2:length(xv), function(x) xv[[x]] + to.add[x-1]))) 
plot (bp,yv, pch = "*", col = colrs) 

enter image description here

У меня есть несколько вопросов, в этом сюжете я не мог понять.

(1) Я хочу использовать разные цвета для разных групп или двух разных цветов для разных групп (например, xv), но когда я попробовал функцию цвета в терминах, чтобы быть красивой смесью. Хотя мне нужно выделить некоторые моменты (например, bp 4000 до 4500, например, с синим цветом)

(2) Вместо позиций bp я хочу поставить галочку и метку с группой.

Благодарим вас, оцените вашу помощь.

Редактирование: с помощью следующего ответа (с небольшим разным подходом в случае, если у меня будет несбалансированное число в каждой группе) Я мог бы получить аналогичный сюжет. Но вопрос о цвете остается вопросом, если я хочу использовать два альтернативных цвета в альтернативной группе?

+0

Вам придется объяснить (по крайней мере, мне), что вы подразумеваете под «двумя альтернативными цветами в альтернативной группе». Вы имеете в виду два цвета, разбросанные внутри друг друга, или каждая альтернативная группа получает другой цвет (например: красный/синий/красный/синий). – thelatemail

+0

да. Я имею в виду, что первая категория будет красной, затем второй синий, затем красный, а затем синий до конца plot – jon

+0

Будет ли это делать трюк? 'plot (bp, yv, pch =" * ", col = rep (c (" красный "," синий "), каждый = 2000, раз = 10), xaxt =" n "); ось (1, at = seq (1000,58000,3000), метки = 1: 20, cex.axis = 0.7, las = 2) ' – thelatemail

ответ

1

Вы можете решить проблему цвета, повторив показатель цвета, однако во много раз каждая группа имеет точку нарисованы, например, так:

plot (bp,yv, pch = "*", col = rep(colrs,each=2000)) 

цвета по умолчанию палитру (см ?palette или palette()) будет обернуть вокруг себя и вы можете указать свой собственный, чтобы получить 20 различных цветов.

Чтобы переклассифицировать ось x, попробуйте выполнить печать без оси и затем вручную укажите точки и метки.

plot (bp,yv, pch = "*", col = rep(colrs,each=2000),xaxt="n") 
axis(1,at=seq(1000,58000,3000),labels=1:20) 

Если вы пытаетесь выжать много наклеек там, возможно, придется сжать текст (cex.axis) или спин ярлыков на 90 градусов (las=2).

plot (bp,yv, pch = "*", col = rep(colrs,each=2000),xaxt="n") 
axis(1,at=seq(1000,58000,3000),labels=1:20,cex.axis=0.7,las=2) 

Результат:

enter image description here

1

Один из способов, вы можете использовать вложенную ifelse.
Я все еще учусь R, но один из способов это можно сделать будет выглядеть примерно так:

plot(whatev$x, whatev$y, col=ifelse(xv<2000,red,ifelse(2000<xv & xv<4000,yellow,blue))) 

Вы можете вложить, как многие из них, как вы хотите, чтобы иметь специфику на цветах и ​​интервалы. Команда ifelse имеет форму ifelse(TEST, True, False).

Проще всего использовать уникальные группы в xv для назначения цветов радуги.

colrs=rainbow(length(unique(xv))) #Or colrs=rainbow(length(xv)) if xv is unique. 
plot(whatev$x, whatev$y, col=colrs) 

Надеюсь, у меня все получилось. Я все еще изучаю R.

1

Я собираюсь выйти на конечность и предположить, что ваши настоящие данные - это что-то вроде 2000 значений вещей из 20 разных групп. Например, высота 2000 растений 20 различных видов.В таком случае вы можете посмотреть функцию dotplot() (или, как показано ниже, dotplot.table()) в пакете lattice.

Сформировать матрицу гипотетических значений:

set.seed(1) 

myY <- sapply(seq_len(20), function(x) rnorm(2000, x^(1/3))) 

транспонирования матрицы, чтобы получить группы в виде строк

myY <- t(myY) 

Обеспечивают имена групп матрицы:

dimnames(myY)[[1]]<-paste("group", seq_len(nrow(myY))) 

нагрузки lattice пакет

library(lattice) 

Сформировать dotplot

dotplot(myY, horizontal = FALSE, panel = function(x, y, horizontal, ...) { 
    panel.dotplot(x = x, y = y, horizontal = horizontal, jitter.x = TRUE, 
    col = seq_len(20)[x], pch = "*", cex = 1.5) 
    }, scales = list(x = list(rot = 90)) 
) 

который выглядит как (с неудачной маркировки оси у):

a dotplot

+0

этот приятный сюжет ... это может быть полезно для других случаев, но в моем случае это не просто группа, но значение x на оси имеет значение ... спасибо за ответы – jon

1

Видя, что @JohnCLK запрашивает способ окрашивания значениями на x оси, я пробовал эти демонстрации в ggplot2 - каждый использует фиктивную переменную, которая кодируется на основе значений или диапазонов, которые будут выделены в других переменных.

Итак, первый установить данные, как и в вопросе:

pos <- rep(1:2000, 20) 
xv <- c(rep(1:20, each = 2000)) 
yv <- (2000*20, 0.5, 0.1) 
xv <- lapply(unique(xv), function(x) pos[xv==x]) 
to.add <- cumsum(sapply(xv, max) + 1000) 
bp <- c(xv[[1]], unlist(lapply(2:length(xv), function(x) xv[[x]] + to.add[x-1]))) 

Затем загрузить ggplot2, подготовить несколько полезных функций, и установить тему по умолчанию:

library("ggplot2") 

make.png <- function(p, fName) { 
    png(fName, width=640, height=480, units="px") 
    print(p) 
    dev.off() 
} 

make.plot <- function(df) { 
    p <- ggplot(df, 
       aes(x = bp, 
        y = yv, 
        colour = highlight)) 
    p <- p + geom_point() 
    p <- p + opts(legend.position = "none") 
    return(p) 
} 

theme_set(theme_bw()) 

Нарисовать график, который выделяет значения в определенном диапазоне по вертикальной оси:

# highlight a horizontal band 
df <- data.frame(cbind(bp, yv)) 
df$highlight <- 0 
df$highlight[ df$yv >= 0.4 & df$yv < 0.45 ] <- 1 
p <- make.plot(df) 
print(p) 
make.png(p, "demo_horizontal.png") 

Horizontal band

Следующая нарисовать сюжет, который выдвигает на первый план значения в определенном диапазоне на x оси, вертикальная полоса:

# highlight a vertical band 
df$highlight <- 0 
df$highlight[ df$bp >= 38000 & df$bp < 42000 ] <- 1 
p <- make.plot(df) 
print(p) 
make.png(p, "demo_vertical.png") 

Vertical band

И, наконец, нарисовать сюжет, который выдвигает на первый план переменного вертикальные полосы, с помощью x значение:

# highlight alternating bands 
library("gtools") 
alt.band.width <- 2000 
df$highlight <- as.integer(df$bp/alt.band.width) 
df$highlight <- ifelse(odd(df$highlight), 1, 0) 
p <- make.plot(df) 
print(p) 
make.png(p, "demo_alternating.png") 

Alternating bands

Надеюсь, что это поможет; в любом случае это была хорошая практика.