散点图指定r中的颜色和标注轴

时间:2012-04-26 05:26:48

标签: r plot colors

我有以下数据和情节:

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位置。

谢谢,谢谢你的帮助。

编辑:在以下答案的帮助下(稍微不同的方法,如果我在每组中有不平衡的数字将起作用)我可以得到类似的情节。但是,如果我想在备用组中使用两种替代颜色,那么仍然存在关于颜色的问题吗?

4 个答案:

答案 0 :(得分:1)

您可以通过重复颜色索引来解决颜色问题,但是每组都有多次绘制点,如下所示:

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

默认调色板(请参阅?palettepalette())将自行包围,您可能需要指定自己的调色板以获得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 :(得分: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.

答案 2 :(得分:1)

我要走出困境,猜测你的真实数据就像来自20个不同群体的2000个价值观。例如,20种不同物种的2000株植物的高度。在这种情况下,您可能需要查看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))
)

看起来像(不幸的y轴标记):

a dotplot

答案 3 :(得分: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

希望这会有所帮助;无论如何,这是一种很好的做法。