【问题标题】:scatter plot specifying color and labelling axis in r在 r 中指定颜色和标签轴的散点图
【发布时间】:2012-04-26 05:26:47
【问题描述】:

我有以下数据和情节:

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)

我在这个情节中有几个我无法弄清楚的问题。

(1) 我想为不同的组使用不同的颜色或为不同的组使用两种不同的颜色(即 xv),但是当我尝试颜色函数时,它是美丽的混合。虽然我需要强调一些点(例如 bp 4000 到 4500 例如蓝色)

(2) 我想在组中添加一个刻度标记和标签,而不是 bp 位置。

谢谢,感谢您的帮助。

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

【问题讨论】:

  • 您将不得不解释(至少对我而言)您所说的“交替组中的两种交替颜色”是什么意思。你的意思是两种颜色相互分散还是每个交替组得到不同的颜色(例如:红色/蓝色/红色/蓝色)
  • 是的,我的意思是第一个类别会变成红色,然后是第二个蓝色,然后是红色,然后是蓝色,直到情节结束
  • 这样可以解决问题吗? plot (bp,yv, pch = "*", col = rep(c("red","blue"),each=2000,times=10),xaxt="n"); axis(1,at=seq(1000,58000,3000),labels=1:20,cex.axis=0.7,las=2)

标签: r plot colors


【解决方案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)

结果:

【讨论】:

    【解决方案2】:

    一种方法是您可以使用嵌套的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。

    【讨论】:

      【解决方案3】:

      我会冒昧地猜测您的真实数据是来自 20 个不同组的事物的 2000 个值。例如,20 种不同物种的 2000 株植物的高度。在这种情况下,您可能需要查看lattice 包中的dotplot() 函数(或如下图所示的dotplot.table())。

      生成假设值矩阵:

      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(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 轴标签):

      【讨论】:

      • 这个不错的情节......它可能对其他情况有帮助,但在我的情况下,它不仅是组,而且轴上的 x 值很重要......感谢您的回答
      【解决方案4】:

      看到@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")
      

      接下来绘制一个图,突出显示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")
      

      最后通过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")
      

      希望这会有所帮助;无论如何,这是个好习惯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 2020-07-05
        • 2021-07-14
        • 2016-01-22
        • 2016-05-04
        相关资源
        最近更新 更多